home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / fsw / zm302 / zm302_s.lzh / ZVT.HAS < prev   
Text File  |  1997-01-17  |  202KB  |  10,947 lines

  1. *-----------------------------------------------
  2. *          X68k ADPCM TOTAL TOOL
  3. *
  4. *            ZVT.X
  5. *
  6. *        PROGRAMMED BY Z.NISHIKAWA
  7. *
  8. *-----------------------------------------------
  9.  
  10. *参考文献一覧
  11. *        X68000パワーアッププログラミング    ASCII        ADPCM→PCM変換法
  12. *        nnPCMDRV.SYSのDOCUMENT        Mr.GORRY    DMA/ADPCMの操作法
  13. *        iocsの解析            T.ARIKUNI    同上
  14. *        Oh!X 1989,11            SOFTBANK    同上
  15. *        68000プログラマーズハンドブック        技評        演算処理関係
  16. *        68000プログラミング入門        ASCII        同上
  17.     .cpu    68000
  18.     .include    iocscall.mac
  19.     .include    doscall.mac
  20.     .include    dma.mac
  21.     .list
  22.     .text
  23.     .even
  24.  
  25. max:        equ    4096
  26. max_b:        equ    12    *maxが2の何乗か
  27. scr_wx:        equ    766    *x width
  28. scr_wy:        equ    85    *y width ±
  29. start_x:    equ    1
  30. plus_:        equ    224
  31. genten_a:    equ    scr_wy
  32. genten_b:    equ    scr_wy+plus_
  33. stack:        equ    $4000    *stackの大きさ
  34. RTS:        equ    $4e75    *rtsの機械語コード
  35. NOP:        equ    $4e71    *NOPの命令コード
  36.  
  37. sftsns    macro    dreg
  38.     move.w    $810.w,dreg
  39.     endm
  40.  
  41. opmwait        macro            *24MHzに改造したXVIへ対応/X68030へ対応させる時
  42.     local    chk_opm_wait
  43. chk_opm_wait:
  44.     tst.b    fm_data_port    *busy check
  45.     bmi    chk_opm_wait
  46.     endm
  47.  
  48. opmset    macro    reg,data    *FM音源のレジスタ書き込み
  49.     opmwait
  50.     move.b    reg,fm_addr_port
  51.     opmwait
  52.     move.b    data,fm_data_port
  53.     endm
  54.  
  55. display    macro    mes,atr,x,y,ln    *メッセージ表示のマクロ
  56.     lea    mes(pc),a1
  57.     moveq.l    #atr,d1
  58.     or.b    d7,d1
  59.     moveq.l    #x,d2
  60.     moveq.l    #y,d3
  61.     moveq.l    #ln-1,d4
  62.     IOCS    _B_PUTMES
  63.     endm
  64.  
  65. display2    macro    mes,atr,x,y,ln    *メッセージ表示のマクロ
  66.     lea    mes(pc),a1
  67.     moveq.l    #atr,d1
  68.     moveq.l    #x,d2
  69.     moveq.l    #y,d3
  70.     moveq.l    #ln-1,d4
  71.     IOCS    _B_PUTMES
  72.     endm
  73.  
  74. display2_    macro    mes,atr,x,y,ln    *メッセージ表示のマクロ
  75.     lea    mes,a1
  76.     moveq.l    #atr,d1
  77.     moveq.l    #x,d2
  78.     moveq.l    #y,d3
  79.     moveq.l    #ln-1,d4
  80.     IOCS    _B_PUTMES
  81.     endm
  82.  
  83. display3    macro    mes,atr,x,y    *メッセージ表示のマクロ
  84.     moveq.l    #atr,d1
  85.     or.b    d7,d1
  86.     IOCS    _B_COLOR
  87.     move.l    d0,-(sp)
  88.     moveq.l    #x,d1
  89.     moveq.l    #y,d2
  90.     IOCS    _B_LOCATE
  91.     lea    mes(pc),a1
  92.     IOCS    _B_PRINT
  93.     move.l    (sp)+,d1
  94.     IOCS    _B_COLOR
  95.     endm
  96.  
  97.     *プログラムスタート
  98.  
  99.     lea    $10(a0),a0    *メモリブロックの変更
  100.     suba.l    a0,a1
  101.     pea    (a1)
  102.     pea    (a0)
  103.     DOS    _SETBLOCK
  104.     addq.w    #8,sp
  105.  
  106.     suba.l    a1,a1
  107.     IOCS    _B_SUPER
  108.     move.l    d0,ssp
  109.  
  110.     move.l    sp,org_sp
  111.     lea    user_sp,sp
  112.  
  113.     tst.b    (a2)+
  114.     beq    editor_start    *何もスイッチがないなら…
  115.  
  116.     lea    title(pc),a1    *タイトル表示
  117.     bsr    ppp
  118.  
  119.     lea    pitch_cmd(pc),a5
  120.     lea    volume_cmd(pc),a6
  121.     clr.b    fn1-pitch_cmd(a5)        *init fn1 to fn3
  122.     clr.b    fn2-pitch_cmd(a5)
  123.     clr.b    fn3-pitch_cmd(a5)
  124.     clr.w    (a5)                *init two of them.
  125.     clr.l    (a6)                *init two of them.
  126.     clr.b    wild_mode-pitch_cmd(a5)
  127. chk_opt_lp:
  128.     tst.b    (a2)
  129.     beq    prepare
  130.     bsr    get_name
  131.  
  132.     lea    input_buffer,a0
  133.     cmpi.b    #'-',(a0)
  134.     beq    option_chk
  135.     cmpi.b    #'/',(a0)
  136.     beq    option_chk
  137.     bsr    sv_fn        *get file name
  138.     bne    print_hlp
  139.     bra    chk_opt_lp
  140.  
  141. option_chk:
  142.     addq.w    #1,a0
  143.     move.b    (a0)+,d0
  144.     move.b    d0,d1
  145.     bsr    mk_capital1
  146.     cmpi.b    #'4',d0        *4-pattren save
  147.     beq    get_param_4
  148.     cmpi.b    #'?',d0
  149.     beq    print_hlp
  150.     cmpi.b    #'A',d1        *convert to adpcm
  151.     beq    ptoa_com_set
  152.     cmpi.b    #'C',d1        *convert to pcm
  153.     beq    atop_com_set
  154.     cmpi.b    #'G',d1
  155.     beq    ok_ed_go
  156.     cmpi.b    #'H',d1
  157.     beq    hakei_hyoji
  158.     cmpi.b    #'I',d1        *insert
  159.     beq    ins_com_set
  160.     cmpi.b    #'L',d1
  161.     beq    read_go
  162.     cmpi.b    #'M',d1        *mix
  163.     beq    mix_com_set
  164.     cmpi.b    #'P',d1        *pitch change
  165.     beq    get_param_p
  166.     cmpi.b    #'V',d1        *volume change
  167.     beq    get_param_v
  168.     cmpi.b    #'T',d1        *automatic truncate
  169.     beq    get_param_t
  170.  
  171.     bra    chk_opt_lp
  172.  
  173. hakei_hyoji:
  174.     not.b    hk_mode
  175.     bra    chk_opt_lp
  176.  
  177. mix_com_set:
  178.     move.l    a0,-(sp)
  179.     lea    mix_cmd(pc),a0
  180.     st    (a0)
  181.     clr.b    mix_mode-mix_cmd(a0)
  182.     clr.b    _4_cmd-mix_cmd(a0)
  183.     clr.b    conv_ptoa_cmd-mix_cmd(a0)
  184.     clr.b    conv_atop_cmd-mix_cmd(a0)
  185.     move.l    (sp)+,a0
  186.     bra    get_param_m
  187.  
  188. ins_com_set:
  189.     move.l    a0,-(sp)
  190.     lea    mix_cmd(pc),a0
  191.     st    (a0)
  192.     st    mix_mode-mix_cmd(a0)
  193.     clr.b    _4_cmd-mix_cmd(a0)
  194.     clr.b    conv_ptoa_cmd-mix_cmd(a0)
  195.     clr.b    conv_atop_cmd-mix_cmd(a0)
  196.     move.l    (sp)+,a0
  197.     bra    get_param_m
  198.  
  199. atop_com_set:            *adpcm to pcm
  200.     cmpi.b    #'8',(a0)
  201.     seq.b    _8bit_pcm    *8 or 16 ?
  202.     bne    @f
  203.     addq.w    #1,a0        *skip 8
  204. @@:
  205.     move.l    a0,-(sp)
  206.     lea    conv_atop_cmd(pc),a0
  207.     st    (a0)
  208.     clr.b    _4_cmd-conv_atop_cmd(a0)
  209.     clr.b    conv_ptoa_cmd-conv_atop_cmd(a0)
  210.     move.l    (sp)+,a0
  211.     bra    chk_opt_lp
  212.  
  213. ptoa_com_set:
  214.     move.l    a0,-(sp)
  215.     lea    conv_ptoa_cmd(pc),a0
  216.     st    (a0)
  217.     clr.b    _4_cmd-conv_ptoa_cmd(a0)
  218.     clr.b    conv_atop_cmd-conv_ptoa_cmd(a0)
  219.     move.l    (sp)+,a0
  220.     bra    chk_opt_lp
  221.  
  222. get_param_t:            *隠れコマンド
  223.     cmpi.b    #' ',(a0)
  224.     bls    chk_opt_lp
  225.     exg    a0,a1
  226.     bsr    get_num
  227.     tst.l    d1
  228.     bmi    fn_error
  229.     cmpi.l    #$ffff,d1
  230.     bhi    fn_error
  231.     move.w    d1,truncate_cmd
  232.     st.b    truncate_cmd+3
  233.     exg    a0,a1
  234.     bra    chk_opt_lp
  235.  
  236. get_param_p:
  237.     exg    a0,a1
  238.     bsr    get_num
  239.     move.b    d1,d2
  240.     bpl    chk_hani
  241.     neg.b    d1
  242. chk_hani:
  243.     cmpi.b    #12,d1
  244.     bhi    fn_error    *絶対値が12以上ならエラー
  245.     tst.b    (a5)
  246.     bne    sv_p_p2
  247.     move.b    d2,(a5)
  248.     bra    exg_p
  249. sv_p_p2:
  250.     tst.b    1(a5)
  251.     bne    fn_error    *スイッチが多すぎ
  252.     move.b    d2,1(a5)
  253. exg_p:
  254.     exg    a0,a1
  255.     bra    chk_opt_lp
  256. get_param_v:
  257.     exg    a0,a1
  258.     bsr    get_num
  259.     tst.w    d1
  260.     beq    fn_error    *0ならエラー
  261.     bmi    fn_error
  262.     cmpi.w    #400,d1
  263.     bhi    fn_error    *400以上ならエラー
  264.     tst.w    (a6)
  265.     bne    sv_p_v2
  266.     move.w    d1,(a6)
  267.     bra    exg_v
  268. sv_p_v2:
  269.     tst.w    2(a6)
  270.     bne    fn_error
  271.     move.w    d1,2(a6)
  272. exg_v:
  273.     exg    a0,a1
  274.     bra    chk_opt_lp
  275.  
  276. get_param_m:
  277.     cmpi.b    #' ',(a0)
  278.     bls    chk_opt_lp
  279.     exg    a0,a1
  280.     bsr    get_num
  281.     tst.l    d1
  282.     bmi    fn_error
  283.     move.l    d1,offset
  284.     exg    a0,a1
  285.     bra    chk_opt_lp
  286.  
  287. get_param_4:
  288.     move.b    (a0)+,d0
  289.     move.b    (a0),d1
  290.     bsr    mk_capital0
  291.     cmpi.b    #'P',d0
  292.     beq    set_4_p
  293.     cmpi.b    #'V',d0
  294.     beq    set_4_v
  295.     bra    fn_error
  296. set_4_p:
  297.     move.b    #'P',_4_cmd
  298.     bra    set_dir
  299. set_4_v:
  300.     move.b    #'V',_4_cmd
  301. set_dir:
  302.     st.b    dirofchg
  303.     move.b    (a0)+,d0
  304.     cmpi.b    #' ',d0
  305.     bls    chk_opt_lp
  306.     cmpi.b    #'+',d0
  307.     beq    chk_opt_lp
  308.     clr.b    dirofchg
  309.     cmpi.b    #'-',d0
  310.     beq    chk_opt_lp
  311.     bra    fn_error
  312.  
  313. prepare:
  314.     move.b    wild_mode(pc),d0
  315.     beq    go_command    *ワイルドカードでない
  316.  
  317.     tst.b    mix_cmd
  318.     bne    prp_mix_wild
  319.                 *ミックス以外でワイルドカードをチェック
  320.     btst.l    #0,d0
  321.     bne    do_wild_prp
  322.     btst.l    #1,d0
  323.     beq    do_wild_prp
  324.     bra    fn_error
  325. prp_mix_wild:            *ミックスでワイルドカードチェック
  326.     btst.l    #0,d0
  327.     beq    do_wild_prp
  328.     btst.l    #1,d0
  329.     beq    do_wild_prp
  330.     bra    fn_error
  331. do_wild_prp:
  332.     clr.b    files_hjm
  333.     move.w    mission_complete(pc),patch1
  334.     move.w    #RTS,mission_complete
  335.  
  336.     bsr    make_true_fn
  337. wild_com_lp:
  338.     bsr    mfree_adpcm_a
  339.     bsr    mfree_adpcm_b
  340.     bsr    mfree_pcm_a
  341.     bsr    mfree_pcm_b
  342.  
  343.     bsr    get_true_fn
  344.     bmi    wild_end
  345.     bsr    get_dest_fn
  346.  
  347. *    pea    fn1(pc)        *for debug
  348. *    DOS    _PRINT
  349. *    addq.w    #4,sp
  350.  
  351.     bsr    go_command
  352.     bra    wild_com_lp
  353. wild_end:
  354.     move.w    patch1,mission_complete
  355.     not.b    files_hjm
  356.     bmi    mission_complete
  357.     bra    fn_error
  358.  
  359. get_dest_fn:            *書き込み側のファイルネーム
  360.     tst.b    mix_cmd
  361.     bmi    case_mxc
  362.     btst.b    #1,wild_mode(pc)
  363.     beq    exit_gdf
  364.     lea    fn1(pc),a0    *読み込み側の名前
  365.     lea    wfn2(pc),a1    *ワイルドカード入り
  366.     lea    fn2(pc),a2    *ワイルドカードを考慮した名前
  367.     bra    do_gdf
  368. case_mxc:
  369.     btst.b    #2,wild_mode(pc)
  370.     beq    exit_gdf
  371.     lea    fn1,a0
  372.     lea    wfn3,a1
  373.     lea    fn3,a2
  374. do_gdf:
  375.     cmpi.b    #':',1(a1)
  376.     bne    do_gdf1
  377.     move.b    (a1)+,(a2)+
  378.     move.b    (a1)+,(a2)+
  379. do_gdf1:
  380.     move.l    a0,work1
  381. gdf_lp:
  382.     move.b    (a1)+,d0
  383.     beq    exit_gdf
  384.     cmpi.b    #'.',d0
  385.     beq    mark_period
  386.     cmpi.b    #'*',d0
  387.     beq    copy_fn1
  388.     cmpi.b    #'?',d0
  389.     bne    gdf1
  390.     move.b    (a0),d0
  391.     cmpi.b    #'.',d0
  392.     beq    add_aregs2
  393. gdf1:
  394.     move.b    d0,(a2)
  395. add_aregs:
  396.     addq.w    #1,a0
  397. add_aregs2:
  398.     addq.w    #1,a2
  399.     bra    gdf_lp
  400. exit_gdf:
  401.     clr.b    (a2)
  402.     rts
  403. mark_period:
  404.     bsr    srch_period
  405.     bra    gdf1
  406. copy_fn1:
  407.     tst.b    (a0)
  408.     beq    gdf_lp
  409. copy_fn1_lp:
  410.     move.b    (a0)+,d0
  411.     move.b    d0,(a2)
  412.     beq    gdf_lp
  413.     cmpi.b    #'.',d0
  414.     beq    gdf_lp
  415.     addq.w    #1,a2
  416.     bra    copy_fn1_lp
  417.  
  418. srch_period:
  419.     move.l    work1,a0
  420. srch_period_lp:
  421.     move.b    (a0),d1
  422.     tst.b    d1
  423.     beq    exit_sp
  424.     cmpi.b    #'.',d1
  425.     beq    exit_sp
  426.     addq.w    #1,a0
  427.     bra    srch_period_lp
  428. exit_sp:
  429.     rts
  430. make_true_fn:            *ちゃんとしたファイルネームを得る
  431.     btst.b    #0,wild_mode(pc)
  432.     beq    chk_wfn2
  433.     move.l    fnbfsz(pc),-(sp)
  434.     DOS    _MALLOC
  435.     addq.w    #4,sp
  436.     move.l    d0,mm_error
  437.     bsr    print_em2
  438.     bmi    bye_bye
  439.     move.l    d0,fn_buffer1
  440.     move.l    d0,a0
  441.     move.l    d0,fn_point1
  442.     lea    wfn1(pc),a2
  443.     bsr    do_make_true_fn
  444.     bmi    fn_error    *そんなファイルネームはない
  445. chk_wfn2:
  446.     tst.b    mix_cmd
  447.     bpl    exit_mtf
  448.     btst.b    #1,wild_mode(pc)
  449.     beq    exit_mtf
  450.     lea    fn2(pc),a0
  451.     lea    wfn2(pc),a2
  452.     bsr    do_make_true_fn
  453.     bmi    fn_error    *そんなファイルネームはない
  454. exit_mtf:
  455.     rts
  456.  
  457. do_make_true_fn:
  458.     * < a0=destination
  459.     * < a2=wild card name
  460.  
  461.     move.l    a0,work1
  462.     clr.b    files_hjm
  463.  
  464.     bsr    get_drive    *getドライブ名
  465.  
  466.     move.w    #%100000,-(sp)
  467.     pea    (a2)        *wild card
  468.     pea    filbuf(pc)
  469.     DOS    _FILES
  470.     lea    10(sp),sp
  471.     tst.l    d0
  472.     bmi    exit_dmtf
  473.     st    files_hjm
  474.     bra    _nm_trns
  475. _nfiles:
  476.     pea    filbuf(pc)
  477.     DOS    _NFILES
  478.     addq.w    #4,sp
  479.     tst.l    d0
  480.     bmi    exit_dmtf
  481. _nm_trns:
  482.     lea    filbuf+30(pc),a1
  483. @@:                *save file_name
  484.     move.b    (a1)+,(a0)+
  485.     bne    @b
  486.     lea.l    wfn2(pc),a1
  487.     cmpa.l    a1,a2        *ミックスのときのfn2は初めに発見したもの
  488.     beq    exit_dmtf
  489.     move.l    a0,d0
  490.     sub.l    work1,d0
  491.     move.l    fnbfsz(pc),d1
  492.     sub.l    #100,d1        *余裕を持って
  493.     cmp.l    d1,d0
  494.     bls    _nfiles
  495.  
  496.     add.l    #$1000,fnbfsz-wfn2(a1)
  497.     move.l    fnbfsz,-(sp)    *new size
  498.     move.l    fn_buffer1,-(sp)    *address
  499.     DOS    _SETBLOCK
  500.     addq.w    #8,sp
  501.     move.l    d0,mm_error
  502.     bsr    print_em2
  503.     bmi    bye_bye
  504.     bra    _nfiles
  505. exit_dmtf:
  506.     st    (a0)        *set end_mark
  507.     not.b    files_hjm
  508.     rts
  509.  
  510. get_drive
  511.     clr.b    drive_name
  512.     move.b    1(a2),d0
  513.     cmpi.b    #':',d0
  514.     bne    exit_gd
  515.     move.b    (a2),drive_name
  516.     move.b    d0,drive_name+1
  517. exit_gd:
  518.     rts
  519.  
  520. get_true_fn:
  521.     btst.b    #0,wild_mode(pc)
  522.     beq    exit_gtf
  523.     move.l    fn_point1,a0
  524.     tst.b    (a0)
  525.     bmi    exit_gtf
  526.     lea    fn1(pc),a1
  527.     bsr    trns_fnm
  528.     move.l    a0,fn_point1
  529. exit_gtf:
  530.     rts
  531. trns_fnm:
  532.     move.b    (a0)+,(a1)+
  533.     bne    trns_fnm
  534.     rts
  535.  
  536. read_go:
  537.     pea    (a0)
  538.     bsr    zvt_init
  539.     move.l    (sp)+,a0
  540.  
  541.     lea    bank_a_fn,a2
  542. @@:                *skip dummy
  543.     move.b    (a0)+,d0
  544.     cmpi.b    #' ',d0
  545.     bls    @b
  546.     cmpi.b    #',',d0
  547.     beq    rg_b?
  548.     subq.w    #1,a0
  549. @@:                *get bank a name
  550.     move.b    (a0)+,d0
  551.     cmpi.b    #' ',d0
  552.     bls    rg_b?
  553.     cmpi.b    #',',d0
  554.     beq    rg_b?
  555.     move.b    d0,(a2)+
  556.     bra    @b
  557. rg_b?:
  558.     clr.b    (a2)        *set end code
  559.     lea    bank_b_fn,a2
  560. @@:                *skip dummy
  561.     move.b    (a0)+,d0
  562.     beq    rg_do
  563.     cmpi.b    #' ',d0
  564.     bls    @b
  565.     subq.w    #1,a0
  566. @@:                *get bank b name
  567.     move.b    (a0)+,d0
  568.     cmpi.b    #' ',d0
  569.     bls    rg_do
  570.     move.b    d0,(a2)+
  571.     bra    @b
  572. rg_do:
  573.     clr.b    (a2)
  574.  
  575.     lea    bank_a_fn,a1
  576.     tst.b    (a1)
  577.     beq    @f
  578.     bsr    open_check
  579.     bsr    print_em
  580.     bmi    all_end_    *case error
  581.     clr.b    data_a
  582.     bsr    mfree_adpcm_a
  583.     bsr    mfree_pcm_a
  584.     lea    bank_a_fn,a1
  585.     bsr    read_data    *d1=size,d2=addr.
  586.     bsr    print_em
  587.     bmi    all_end_    *case error
  588.     move.l    d1,size1
  589.     beq    all_end_    *case error
  590.     move.l    d2,address1    *読み込んだのはadpcm data
  591.     bsr    new_bank_a
  592. @@:
  593.     lea    bank_b_fn,a1
  594.     tst.b    (a1)
  595.     beq    @f
  596.     bsr    open_check
  597.     bsr    print_em
  598.     bmi    all_end_    *case error
  599.     clr.b    data_b
  600.     bsr    mfree_adpcm_b
  601.     bsr    mfree_pcm_b
  602.     lea    bank_b_fn,a1
  603.     bsr    read_data    *d1=size,d2=addr.
  604.     bsr    print_em
  605.     bmi    all_end_    *case error
  606.     move.l    d1,size2
  607.     beq    all_end_    *case error
  608.     move.l    d2,address2
  609.     bsr    new_bank_b
  610. @@:
  611.     bra    oeg0
  612.  
  613. zvt_init:
  614.     bsr    other_init
  615.     IOCS    _OS_CUROF
  616.     bsr    g_init
  617.     bra    val_init
  618.  
  619. editor_start:            *エディター部のスタート
  620.     bsr    use_gram??
  621.     bne    gram_error
  622. ok_ed_go:
  623.     bsr    zvt_init
  624. oeg0:
  625.     bsr    zen_clr        *全画面クリア
  626.     bsr    scr_init
  627.     bsr    set_vect
  628.     IOCS    _OS_CUROF
  629.     move.w    #%000000000011111_0,$e82200+4*2    *text line palet(color code4)blue
  630.     move.w    #%000001111100000_0,$e82200+8*2    *text line palet(color code8)red
  631.     move.w    #13324,$e82200+12*2        *▲カーソルの色
  632.     bsr    g_recover
  633.     lea    ent_path,a0
  634.     DOS    _CURDRV
  635.     move.w    d0,(a0)+
  636.     move.b    #'\',(a0)+
  637.     pea    (a0)
  638.     clr.w    -(sp)
  639.     DOS    _CURDIR
  640.     addq.w    #6,sp
  641.                     *メインルーチン
  642. num_of_comm:    equ    17
  643. max_size:    equ    12582912    *12Mb
  644.                     *ワーク初期化
  645.     clr.b    bank_sel
  646.     moveq.l    #0,d6
  647.     move.b    d6,last_point
  648.     bsr    disp_point
  649.  
  650. m_lp:
  651.     IOCS    _B_KEYINP
  652.                 *alphabet
  653.     move.w    d0,d1
  654.     bsr    mk_capital1
  655.     cmpi.b    #'A',d1        *select bank a
  656.     beq    bank_change_a
  657.     cmpi.b    #'B',d1        *select bank b
  658.     beq    bank_change_b
  659.     cmpi.b    #'C',d1        *波形の切り出し
  660.     beq    truncate
  661.     cmpi.b    #'D',d1        *DISK
  662.     beq    disk_mode
  663.     cmpi.b    #'E',d1        *effect
  664.     beq    effect
  665.     cmpi.b    #'F',d1        *change rate(FRQ)
  666.     beq    _chg_rate
  667.     cmpi.b    #'I',d1        *波形の頭だし
  668.     beq    quantize
  669.     cmpi.b    #'J',d1        *周波数微調整
  670.     beq    adjust_frq
  671.     cmpi.b    #'K',d1        *PITCH CHANGE
  672.     beq    pitch_chg
  673.     cmpi.b    #'M',d1        *monitor switch
  674.     beq    M_ON
  675.     cmpi.b    #'N',d1        *ポルタメント
  676.     beq    portament
  677.     cmpi.b    #'O',d1        *pan pot
  678.     beq    _OUT
  679.     cmpi.b    #'P',d1        *再生
  680.     beq    playing
  681.     cmpi.b    #'Q',d1        *esc+q = all end
  682.     beq    all_end
  683.     cmpi.b    #'R',d1        *録音
  684.     beq    record
  685.     cmpi.b    #'S',d1        *input smp size
  686.     beq    input_smsz
  687.     cmpi.b    #'T',d1        *input smp time
  688.     beq    input_smpt
  689.     cmpi.b    #'V',d1        *LEVEL change
  690.     beq    level_chg
  691.     cmpi.b    #'X',d1        *BANK CHANGE
  692.     beq    bank_change
  693.     cmpi.b    #'Y',d1        *deconvolution
  694.     beq    deconvolution_ope
  695.     cmpi.b    #'Z',d1        *convolution
  696.     beq    convolution_ope
  697.     cmpi.b    #'@',d1        *trigger
  698.     beq    _AUTO_
  699.  
  700.     cmpi.b    #$1b,d0        *ESC
  701.     seq    ESC_ON
  702.     cmpi.b    #$0d,d0        *return/enter
  703.     beq    CR_key
  704.     cmpi.b    #' ',d0        *SPC=return/enter
  705.     beq    CR_key
  706.     cmpi.b    #'.',d0        *point end
  707.     beq    data_move?
  708.     cmpi.b    #',',d0        *point middle
  709.     beq    data_move?
  710.     cmpi.b    #'+',d0        *MIX 2 pcm data
  711.     beq    mixing
  712.     cmpi.b    #'-',d0        *SUB 2 pcm data
  713.     beq    logic_ope
  714.     cmpi.b    #'/',d0        *insert data
  715.     beq    insert
  716.     cmpi.b    #'*',d0        *PCMデータ表示モード
  717.     beq    ast_ope
  718.     cmpi.b    #'=',d0        *data copy
  719.     beq    copy_data
  720.     cmpi.b    #'?',d0        *情報
  721.     beq    information
  722.  
  723.     move.b    d0,d1
  724.     sub.b    #$30,d1
  725.     cmpi.b    #9,d1
  726.     bhi    _ido
  727.     tst.b    d1
  728.     bpl    data_move?
  729.  
  730. *移動方向キー
  731. _ido:
  732.     move.w    d0,d1
  733.     lsr.w    #8,d1
  734.  
  735.     cmpi.b    #2*8+0,d1    *tab -> data type change
  736.     beq    _chg_type
  737.     cmpi.b    #7*8+7,d1    *data clear
  738.     beq    data_clr
  739.  
  740.     cmpi.b    #3,d6
  741.     bhi    case_btm
  742. *ue??
  743.     cmpi.w    #7*8+4,d1
  744.     bne    shita??
  745. _ue?:
  746.     tst.b    d6
  747.     bne    set_u
  748. *    moveq.l    #num_of_comm,d6
  749.     bra    move_point
  750. set_u:
  751.     moveq.l    #-1,d0
  752.     bra    move_point
  753. shita??:
  754.     cmpi.b    #7*8+6,d1
  755.     bne    hidari??
  756. _sht?:
  757.     cmp.b    #num_of_comm,d6
  758.     bne    nml_mv_
  759. *    moveq.l    #0,d6
  760.     moveq.l    #0,d0
  761.     bra    move_point
  762. nml_mv_:
  763.     moveq.l    #1,d0
  764.     bra    move_point
  765. case_btm:
  766. hidari??:
  767.     cmpi.b    #7*8+3,d1
  768.     beq    _ue?
  769. *migi??:
  770.     cmpi.b    #7*8+5,d1
  771.     beq    _sht?
  772.  
  773. *ue??
  774.     cmpi.w    #7*8+4,d1
  775.     bne    shita_??
  776.     cmpi.b    #9,d6
  777.     bls    _ue?
  778.     cmpi.b    #16,d6
  779.     bcs    go_sr??
  780.     moveq.l    #-8,d0
  781.     bra    move_point
  782. go_sr??:
  783.     cmpi.b    #12,d6
  784.     bls    nml_ue
  785.     moveq.l    #0,d0
  786.     moveq.l    #7,d6
  787.     bra    move_point
  788. nml_ue:
  789.     moveq.l    #-6,d0
  790.     bra    move_point
  791. shita_??:
  792.     cmpi.b    #7*8+6,d1
  793.     bne    tsugi_k
  794.     cmp.b    #9,d6
  795.     bhi    _sht?
  796.     cmpi.b    #8,d6
  797.     bcs    nml_sht
  798.     moveq.l    #8,d0
  799.     bra    move_point
  800. nml_sht:
  801.     moveq.l    #6,d0
  802.     bra    move_point
  803.  
  804. tsugi_k
  805.     bra    m_lp
  806.  
  807. move_point:
  808.     add.b    d0,d6
  809.     bsr    del_point
  810.     bsr    disp_point
  811.     bra    m_lp
  812. del_point:
  813.     moveq.l    #0,d7
  814.     move.b    last_point(pc),d0
  815.     bra    get_go_dsp
  816. disp_point:
  817.     moveq.l    #%1000,d7
  818.     move.b    d6,last_point
  819.     move.b    d6,d0
  820. get_go_dsp:
  821.     ext.w    d0
  822.     add.w    d0,d0
  823.     move.w    jump_tbl(pc,d0.w),a0    *jump!
  824.     jmp    jump_tbl(pc,a0.w)
  825.  
  826. jump_tbl:                *CURSOR OPERATION
  827.     dc.w    _stpt1-jump_tbl,_edpt1-jump_tbl
  828.     dc.w    _stpt2-jump_tbl,_edpt2-jump_tbl
  829.     dc.w    _mon-jump_tbl,_dt_tp-jump_tbl
  830.     dc.w    _smp_tm-jump_tbl,_smp_rt-jump_tbl
  831.     dc.w    _rec-jump_tbl,_files-jump_tbl
  832.     dc.w    _out_as-jump_tbl,_at_md-jump_tbl
  833.     dc.w    _smp_sz-jump_tbl,_level-jump_tbl
  834.     dc.w    _pitch-jump_tbl,_mix-jump_tbl
  835.     dc.w    _play-jump_tbl,_quit-jump_tbl
  836.  
  837. CR_key:
  838.     bsr    del_point
  839.  
  840.     cmpi.b    #4,d6
  841.     beq    M_ON
  842.     cmpi.b    #17,d6
  843.     beq    all_end2
  844.     cmpi.b    #10,d6
  845.     beq    _OUT
  846.     cmpi.b    #11,d6
  847.     beq    _AUTO_
  848.     cmpi.b    #7,d6
  849.     beq    _chg_rate
  850.     cmpi.b    #5,d6
  851.     beq    _chg_type
  852.     cmpi.b    #6,d6
  853.     beq    input_smpt
  854.     cmpi.b    #12,d6
  855.     beq    input_smsz
  856.     cmpi.b    #9,d6
  857.     beq    disk_mode
  858.     cmpi.b    #8,d6
  859.     beq    record
  860.     cmpi.b    #16,d6
  861.     beq    playing
  862.     cmpi.b    #13,d6
  863.     beq    level_chg
  864.     cmpi.b    #14,d6
  865.     beq    pitch_chg
  866.     cmpi.b    #15,d6
  867.     beq    mixing
  868.  
  869.     bsr    disp_point
  870.     bra    m_lp
  871. complete:
  872.     bsr    del_point
  873.     bsr    disp_point
  874.     bra    m_lp
  875.  
  876. information:            *情報をプリント
  877.     movem.l    d0-d7/a0-a6,reg_buff2
  878.     bsr    clr_bottom
  879.  
  880.     display2    bank_a,%1111,0,28,8
  881.     display2    i_adpcmadr,%0011,0,29,20
  882.     lea    suji(pc),a1
  883.     move.l    address1(pc),d0
  884.     bsr    get_hex32
  885.     display2    suji,%0011,19,29,8
  886.  
  887.     display2    i_pcmadr,%0011,29,29,21
  888.     lea    suji(pc),a1
  889.     move.l    buffer1(pc),d0
  890.     bsr    get_hex32
  891.     display2    suji,%0011,49,29,8
  892.  
  893.     display2    i_start,%0011,0,30,20
  894.     lea    suji(pc),a1
  895.     move.l    start_point1(pc),d0
  896.     move.l    end_point1(pc),d7
  897.     move.l    d7,d6
  898.     tst.b    data_type
  899.     bne    inf1
  900.     sub.l    buffer1(pc),d0
  901.     sub.l    buffer1(pc),d7
  902.     sub.l    start_point1(pc),d6
  903.     beq    inf2
  904.     addq.l    #2,d6
  905.     bra    inf2
  906. inf1:
  907.     sub.l    address1(pc),d0
  908.     sub.l    address1(pc),d7
  909.     sub.l    start_point1(pc),d6
  910.     beq    inf2
  911.     addq.l    #1,d6
  912. inf2:
  913.     bsr    get_hex32
  914.     display2    suji,%0011,19,30,8
  915.  
  916.     display2    i_end,%0011,29,30,21
  917.     lea    suji(pc),a1
  918.     move.l    d7,d0
  919.     bsr    get_hex32
  920.     display2    suji,%0011,49,30,8
  921.  
  922.     display2    i_size,%0011,0,31,20
  923.     lea    suji(pc),a1
  924.     move.l    size1(pc),d0
  925.     bsr    get_hex32
  926.     display2    suji,%0011,19,31,8
  927.  
  928.     display2    i_efsz,%0011,29,31,20
  929.     lea    suji(pc),a1
  930.     move.l    d6,d0
  931.     bsr    get_hex32
  932.     display2    suji,%0011,49,31,8
  933.  
  934.     bsr    get_spc
  935. *バンクB
  936.     bsr    clr_bottom
  937.  
  938.     display2    bank_b,%1111,0,28,8
  939.     display2    i_adpcmadr,%0011,0,29,20
  940.     lea    suji(pc),a1
  941.     move.l    address2(pc),d0
  942.     bsr    get_hex32
  943.     display2    suji,%0011,19,29,8
  944.  
  945.     display2    i_pcmadr,%0011,29,29,21
  946.     lea    suji(pc),a1
  947.     move.l    buffer2(pc),d0
  948.     bsr    get_hex32
  949.     display2    suji,%0011,49,29,8
  950.  
  951.     display2    i_start,%0011,0,30,20
  952.     lea    suji(pc),a1
  953.     move.l    start_point2(pc),d0
  954.     move.l    end_point2(pc),d7
  955.     move.l    d7,d6
  956.     tst.b    data_type
  957.     bne    inf3
  958.     sub.l    buffer2(pc),d0
  959.     sub.l    buffer2(pc),d7
  960.     sub.l    start_point2(pc),d6
  961.     beq    inf4
  962.     addq.l    #2,d6
  963.     bra    inf4
  964. inf3:
  965.     sub.l    address2(pc),d0
  966.     sub.l    address2(pc),d7
  967.     sub.l    start_point2(pc),d6
  968.     beq    inf4
  969.     addq.l    #1,d6
  970. inf4:
  971.     bsr    get_hex32
  972.     display2    suji,%0011,19,30,8
  973.  
  974.     display2    i_end,%0011,29,30,21
  975.     lea    suji(pc),a1
  976.     move.l    d7,d0
  977.     bsr    get_hex32
  978.     display2    suji,%0011,49,30,8
  979.  
  980.     display2    i_size,%0011,0,31,20
  981.     lea    suji(pc),a1
  982.     move.l    size2(pc),d0
  983.     bsr    get_hex32
  984.     display2    suji,%0011,19,31,8
  985.  
  986.     display2    i_efsz,%0011,29,31,20
  987.     lea    suji(pc),a1
  988.     move.l    d6,d0
  989.     bsr    get_hex32
  990.     display2    suji,%0011,49,31,8
  991.  
  992.     bsr    get_spc
  993.  
  994.     bsr    clr_bottom
  995.  
  996.     display2    max_free,%0011,0,28,10
  997.     pea    $ffffff
  998.     DOS    _MALLOC
  999.     addq.w    #4,sp
  1000.     andi.l    #$ffffff,d0
  1001.     move.l    d0,d7
  1002.     lea    suji(pc),a1
  1003.     bsr    get_hex32
  1004.     display2    suji,%0011,10,28,8
  1005.  
  1006.     display2    kakko,%0011,18,28,10
  1007.     lea    suji(pc),a1
  1008.     move.l    d7,d0
  1009.     bsr    num_to_str
  1010.     display2    suji+2,%0011,19,28,8
  1011.  
  1012.  
  1013.     bsr    get_spc
  1014.     movem.l    reg_buff2,d0-d7/a0-a6
  1015.     bra    non_ope
  1016.  
  1017. playing:                *再生
  1018.     clr.b    played        *marker clear
  1019.     bsr    get_pt1
  1020.     moveq.l    #0,d7
  1021.     moveq.l    #0,d1
  1022.     IOCS    _ADPCMMOD    *まず停止
  1023.  
  1024.     move.b    data_a(pc),d0
  1025.     or.b    data_b(pc),d0
  1026.     beq    ext_play
  1027.  
  1028.     lea    address1(pc),a0
  1029.     tst.b    bank_sel
  1030.     beq    play??
  1031.     lea    20(a0),a0        *bank_b base addr.
  1032.     tst.b    data_b
  1033.     beq    ext_play
  1034.     bra    do_play
  1035. play??:
  1036.     tst.b    data_a
  1037.     beq    ext_play
  1038. do_play:
  1039.     move.b    sampling_rate(pc),d1
  1040.     lsl.w    #8,d1
  1041.     move.b    out_assign(pc),d1
  1042.  
  1043.     tst.b    data_type        *データモードがpcmのとき
  1044.     beq    play_pcm
  1045.  
  1046.     bsr    put_pt1
  1047.     movea.l    pstart(a0),a1
  1048.     move.l    pend(a0),d2
  1049.     sub.l    a1,d2
  1050.     addq.l    #1,d2
  1051. *    cmpi.l    #$ff00,d2
  1052. *    bls    go_ADPCMOUT
  1053. *    bsr    disp_pl_mes
  1054. go_ADPCMOUT:
  1055.     st    played            *set marker
  1056.     IOCS    _ADPCMOUT
  1057. ext_play:
  1058.     tst.b    played            *演奏してなければ関係無し
  1059.     beq    del_plmes
  1060.     moveq.l    #0,d0
  1061.     bsr    mt_on_off        *monitor mode強制オフ
  1062. del_plmes:
  1063. *    bsr    put_pt1            *メッセージ消去
  1064.     bra    complete
  1065. play_pcm:                *データモードがpcm
  1066.     tst.l    paddress(a0)
  1067.     beq    make_adpcm
  1068. plp00:
  1069.     tst.b    bank_sel
  1070.     bne    plp01
  1071.     bsr    calc_es_adpcm_a
  1072.     bra    plp02
  1073. plp01:
  1074.     bsr    calc_es_adpcm_b
  1075. plp02:
  1076.     bsr    put_pt1
  1077.     movea.l    pstart(a0),a1
  1078.     move.l    pend(a0),d2
  1079.     sub.l    a1,d2
  1080.     addq.l    #1,d2
  1081. *    cmpi.l    #$ff00,d2
  1082. *    bls    go_ADPCMOUT2
  1083. *    bsr    disp_pl_mes
  1084. go_ADPCMOUT2:
  1085.     st    played            *set marker
  1086.     IOCS    _ADPCMOUT
  1087.  
  1088.     tst.b    bank_sel
  1089.     bne    plp03
  1090.     bsr    calc_es_pcm_a
  1091.     bra    ext_play
  1092. plp03:
  1093.     bsr    calc_es_pcm_b
  1094.     bra    ext_play
  1095. *disp_pl_mes:
  1096. *    movem.l    d0-d4/a1,-(sp)
  1097. *    display2    pl_mes,%1110,43,15,11    *メッセージ表示
  1098. *    movem.l    (sp)+,d0-d4/a1
  1099. *    rts
  1100.  
  1101. make_adpcm:
  1102.     bsr    dsp_cv_mes
  1103.     tst.b    bank_sel
  1104.     bne    m_a_b
  1105.     bsr    make_adpcm_a
  1106.     bmi    ext_play
  1107.     bra    plp00
  1108. m_a_b:
  1109.     bsr    make_adpcm_b
  1110.     bmi    ext_play
  1111.     bra    plp00
  1112. make_adpcm_a:
  1113.     movem.l    d0-d7/a0-a6,-(sp)
  1114.     move.l    size1,d1
  1115.     move.l    d1,-(sp)
  1116.     DOS    _MALLOC
  1117.     addq.w    #4,sp
  1118.     move.l    d0,mm_error
  1119.     bsr    print_em
  1120.     bmi    ext_make_aa            *case:error
  1121.     movea.l    d0,a0
  1122.     move.l    d0,address1
  1123.     movea.l    buffer1(pc),a1
  1124.     move.l    size1(pc),d0
  1125.     bsr    pcm_to_adpcm
  1126.     moveq.l    #0,d0
  1127. ext_make_aa:
  1128.     tst.l    d0
  1129.     movem.l    (sp)+,d0-d7/a0-a6
  1130.     rts
  1131. make_adpcm_b:
  1132.     movem.l    d0-d7/a0-a6,-(sp)
  1133.     move.l    size2(pc),d1
  1134.     move.l    d1,-(sp)
  1135.     DOS    _MALLOC
  1136.     addq.w    #4,sp
  1137.     move.l    d0,mm_error
  1138.     bsr    print_em
  1139.     bmi    ext_make_ab            *case:error
  1140.     movea.l    d0,a0
  1141.     move.l    d0,address2
  1142.     movea.l    buffer2(pc),a1
  1143.     move.l    size2(pc),d0
  1144.     bsr    pcm_to_adpcm
  1145.     moveq.l    #0,d0
  1146. ext_make_ab:
  1147.     tst.l    d0
  1148.     movem.l    (sp)+,d0-d7/a0-a6
  1149.     rts
  1150.  
  1151. paddress:    equ    0
  1152. pbuffer:    equ    4
  1153. psize:        equ    8
  1154. pstart:        equ    12
  1155. pend:        equ    16
  1156.  
  1157. record:                *録音
  1158.     movem.l    d0-d7/a0-a6,-(sp)
  1159.     moveq.l    #0,d7
  1160.     clr.l    work1
  1161.  
  1162.     lea    address1(pc),a0
  1163.     tst.b    bank_sel
  1164.     bne    free_b
  1165. *free_a:
  1166.     clr.b    data_a
  1167.     bsr    mfree_adpcm_a
  1168.     bsr    mfree_pcm_a
  1169.     bra    do_rec
  1170. free_b:
  1171.     lea    20(a0),a0        *bank_b
  1172.     clr.b    data_b
  1173.     bsr    mfree_adpcm_b
  1174.     bsr    mfree_pcm_b
  1175. do_rec:
  1176.     clr.l    pstart(a0)
  1177.     clr.l    pend(a0)
  1178.  
  1179.     bsr    get_pt1        *メッセージエリアの背景をゲット
  1180.  
  1181.     move.l    rec_data_size(pc),d2
  1182.     move.l    d2,psize(a0)    *save size
  1183.     move.l    d2,-(sp)    *d2=rec size
  1184.     DOS    _MALLOC
  1185.     addq.w    #4,sp
  1186.     move.l    d0,mm_error
  1187.     bsr    print_em
  1188.     bmi    ext_rcd        *case:error
  1189.     move.l    d0,a1
  1190.     move.l    d0,paddress(a0)
  1191.  
  1192.     movem.l    d2/a1,-(sp)
  1193.  
  1194.     move.w    sr,-(sp)
  1195.     ori.w    #$0700,sr
  1196.     move.b    #$10,CCR3    *動作しない
  1197.     st    CSR3
  1198.     move.b    #$88,$e92003
  1199.     tst.b    trigger        *オートモードの時はadpcm all endしない
  1200.     bne    non_aae
  1201.     move.b    #%0000_0001,$e92001    *adpcm all end
  1202.     bra    @f
  1203. non_aae:
  1204.     addq.w    #1,a1        *peakで検出した1バイトもデータに入れるため
  1205.     subq.l    #1,d2        *つじつま合わせ
  1206. @@:
  1207.     clr.b    DMADSTAT.w
  1208.     move.w    (sp)+,sr
  1209. *    bsr    set_pan_frq
  1210.  
  1211.     move.b    #$c0,DCR3
  1212.     move.b    #$82,OCR3    *reqによる8ビット転送
  1213.     move.b    #FC_SUPER_DATA,MFC3
  1214.     move.b    #FC_SUPER_DATA,DFC3
  1215.     move.b    #$04,SCR3    *メモリー側のみ増加
  1216.     move.l    a1,MAR3        *set dest. addr.
  1217.     move.l    #$e92003,DAR3    *pcm addr.
  1218.     move.w    d2,MTC3        *set counter
  1219.  
  1220.     cmpi.l    #$ffff,d2
  1221.     bls    chk_trg
  1222.                 *データ長が$ffffより長いケース
  1223.     move.l    d2,d3        *d3=size
  1224.     move.l    d2,d1
  1225.     move.l    #$ffff,d2
  1226.     bsr    wari
  1227.     tst.l    d2
  1228.     beq    _6bai
  1229.     addq.l    #1,d1
  1230. _6bai:
  1231.     move.l    d1,d7
  1232.     add.l    d1,d1
  1233.     move.l    d1,d2
  1234.     add.l    d1,d1
  1235.     add.l    d2,d1        d1=d1*6
  1236.     move.l    d1,-(sp)
  1237.     DOS    _MALLOC
  1238.     addq.w    #4,sp
  1239.     move.l    d0,mm_error
  1240.     bsr    print_em
  1241.     bmi    ext_rcd        *case:error
  1242.     move.l    d0,work1
  1243.     move.l    d0,a2        *a2=aray table
  1244. mk_at_l:
  1245.     cmpi.l    #$ffff,d3
  1246.     bcs    last_at
  1247.     move.l    a1,(a2)+    *addr
  1248.     move.w    #$ffff,(a2)+    *len
  1249.     adda.l    #$ffff,a1
  1250.     sub.l    #$ffff,d3
  1251.     bne    mk_at_l
  1252.     bra    set_at_dma
  1253. last_at:
  1254.     move.l    a1,(a2)+    *addr
  1255.     move.w    d3,(a2)+    *len
  1256. set_at_dma:
  1257.     move.b    #%1000_1010,OCR3
  1258.     move.w    d7,BTC3        *num of aray tbl
  1259.     move.l    work1(pc),BAR3    *aray tbl addr
  1260.  
  1261. chk_trg:
  1262.     move.b    trigger(pc),d0
  1263.     and.b    monitor_mode(pc),d0
  1264.     beq    go_rec
  1265.     display2    peak_mes,%1110,41,15,13
  1266.  
  1267.     lea    $e92003,a1
  1268.     moveq.l    #$08,d1
  1269.     moveq.l    #$80,d2
  1270. peak_lp:
  1271.     move.b    (a1),d7
  1272.     cmp.b    d1,d7
  1273.     beq    peak_lp
  1274.     cmp.b    d2,d7
  1275.     beq    peak_lp
  1276. go_rec:
  1277.     display2    rc_mes,%1110,41,15,13    *メッセージ表示
  1278.     movem.l    (sp)+,d2/a1
  1279.  
  1280.     move.b    d7,(a1)
  1281.  
  1282.     move.b    #$88,CCR3    *dma go!
  1283.     move.b    #$4,$e92001    *pcm rec mode
  1284. rc00:
  1285.     moveq.l    #0,d1
  1286.     IOCS    _BITSNS
  1287.     btst.l    #1,d0
  1288.     beq    chk_mtc3
  1289.     bsr    adpcm_end
  1290.     moveq.l    #0,d7
  1291.     tst.b    bank_sel
  1292.     bne    @f
  1293.     bsr    _bank_a
  1294.     bsr    waku1
  1295.     bsr    init_hex_area_a
  1296.     bra    ext_rcd
  1297. @@:
  1298.     bsr    _bank_b
  1299.     bsr    waku2
  1300.     bsr    init_hex_area_b
  1301.     bra    ext_rcd
  1302. chk_mtc3:
  1303.     tst.w    MTC3
  1304.     bne    rc00        *dmaが動作終了するまでループ
  1305. exit_rc00:
  1306.     bsr    put_pt1
  1307.  
  1308.     tst.b    bank_sel
  1309.     bne    mark_dtb
  1310.  
  1311.     st    data_a
  1312.     bsr    waku1
  1313.     tst.b    data_type
  1314.     bne    rc01
  1315.     bsr    get_pt1
  1316.     display2    cv_mes,%1110,41,15,14
  1317.     bsr    make_pcm_a
  1318.     bmi    ext_rcd
  1319.     movea.l    4(a0),a6    *a6=buffer
  1320.     move.l    8(a0),d6
  1321.     move.w    #scr_wy,genten_y
  1322.     bsr    dsp_wv
  1323.     bra    rc01_
  1324. rc01:
  1325.     movea.l    (a0),a6        *a6=buffer
  1326.     move.l    8(a0),d6
  1327.     move.w    #scr_wy,genten_y
  1328.     bsr    dsp_wv_2
  1329. rc01_:
  1330.     bsr    init_hex_area_a
  1331.     bra    ext_rcd
  1332. mark_dtb:
  1333.     st    data_b
  1334.     bsr    waku2
  1335.     tst.b    data_type
  1336.     bne    rc02
  1337.     bsr    get_pt1
  1338.     display2    cv_mes,%1110,41,15,14
  1339.     bsr    make_pcm_b
  1340.     bmi    ext_rcd
  1341.     movea.l    4(a0),a6    *a6=buffer
  1342.     move.l    8(a0),d6
  1343.     move.w    #scr_wy+plus_,genten_y
  1344.     bsr    dsp_wv
  1345.     bra    rc02_
  1346. rc02:
  1347.     movea.l    (a0),a6        *a6=buffer
  1348.     move.l    8(a0),d6
  1349.     move.w    #scr_wy+plus_,genten_y
  1350.     bsr    dsp_wv_2
  1351. rc02_:
  1352.     bsr    init_hex_area_b
  1353.  
  1354. ext_rcd:
  1355.     tst.l    work1
  1356.     beq    extr1
  1357.     move.l    work1(pc),-(sp)
  1358.     DOS    _MFREE        *bye aray table
  1359.     addq.w    #4,sp
  1360. extr1:
  1361.     tst.b    monitor_mode
  1362.     bne    extr2
  1363.     move.b    #$08,$e92003
  1364.     move.b    #%0000_0001,$e92001    *adpcm all end
  1365. extr2:
  1366.     movem.l    (sp)+,d0-d7/a0-a6
  1367.     bsr    put_pt1            *メッセージ消去
  1368.     bra    complete
  1369.  
  1370. meyasu:    equ    48        *頭だしの目安(0 levelが幾つあったらデータエンドにするか)
  1371. quantize:            *波形の頭だし
  1372.     lea    address1(pc),a0
  1373. *    moveq.l    #0,d0
  1374.     tst.b    bank_sel
  1375.     beq    qt0
  1376.     lea    20(a0),a0        *bank_b
  1377.     tst.b    data_b
  1378.     beq    exit_qt
  1379.     bra    qt1
  1380. qt0:
  1381.     tst.b    data_a
  1382.     beq    exit_qt
  1383. qt1:
  1384.     move.l    8(a0),d2    *d2=size
  1385.     tst.b    data_type
  1386.     bne    qt2
  1387. *    moveq.l    #4,d0        *pcm
  1388.     lsl.l    #2,d2        *size=size*4(PCM DATA SIZE)
  1389. qt2:
  1390. *    movea.l    (a0,d0.w),a1    *base data addr.
  1391.     movea.l    pstart(a0),a1    *base data addr.
  1392.     tst.b    data_type
  1393.     beq    case_qt_pcm
  1394.                 *case adpcm
  1395.     lea    (a1,d2.l),a2    *a2=end addr
  1396.     move.l    a1,12(a0)    *default
  1397.     move.l    a2,16(a0)
  1398. get_hd_lp:
  1399.     cmpa.l    a1,a2
  1400.     beq    exit_qt        *最後まで来てしまった…
  1401.     move.b    (a1)+,d0
  1402.     cmpi.b    #$80,d0
  1403.     beq    get_hd_lp
  1404.     cmpi.b    #$08,d0
  1405.     beq    get_hd_lp
  1406.     subq.w    #1,a1
  1407.     move.l    a1,12(a0)    *save start
  1408.     addq.w    #1,a1
  1409. get_tl:
  1410.     moveq.l    #0,d1        *found counter
  1411. get_tl_lp:
  1412.     cmpa.l    a1,a2
  1413.     beq    exit_qt
  1414.     move.b    (a1)+,d0
  1415.     cmpi.b    #$80,d0
  1416.     beq    @f
  1417.     cmpi.b    #$08,d0
  1418.     bne    get_tl_lp
  1419. @@:
  1420.     move.l    a1,work1
  1421. get_tl_lp1:
  1422.     cmpa.l    a1,a2
  1423.     beq    exit_qt
  1424.     move.b    (a1)+,d0
  1425.     cmpi.b    #$80,d0
  1426.     beq    @f
  1427.     cmpi.b    #$08,d0
  1428.     bne    get_tl
  1429. @@:
  1430.     addq.l    #1,d1
  1431.     cmpi.b    #meyasu,d1
  1432.     bcs    get_tl_lp1
  1433.     move.l    work1(pc),d0
  1434.     subq.l    #1,d0
  1435.     move.l    d0,16(a0)    *save end
  1436. exit_qt:
  1437.     tst.b    bank_sel
  1438.     bne    qt_b
  1439.     bsr    init_hex_area_a
  1440.     bra    m_lp
  1441. qt_b:
  1442.     bsr    init_hex_area_b
  1443.     bra    m_lp
  1444. lmt:    equ    2
  1445. case_qt_pcm:            *データモードがPCMのケース
  1446.     lea    (a1,d2.l),a2    *a2=end addr
  1447.     move.l    a1,12(a0)    *default
  1448.     move.l    a2,16(a0)
  1449.     moveq.l    #0,d3
  1450. get_hd_lp_:
  1451.     cmpa.l    a1,a2
  1452.     bls    exit_qt        *最後まで来てしまった…
  1453.     move.w    (a1),d0
  1454.     sub.w    d3,d0
  1455.     move.w    (a1)+,d3
  1456.     tst.w    d0
  1457.     bpl    @f
  1458.     neg.w    d0
  1459. @@:
  1460.     cmpi.w    #lmt,d0
  1461.     bls    get_hd_lp_
  1462.     subq.w    #2,a1
  1463.     move.l    a1,12(a0)    *save start
  1464.     addq.w    #2,a1
  1465. get_tl_:
  1466.     moveq.l    #0,d1        *found counter
  1467.     moveq.l    #0,d3
  1468. get_tl_lp_:
  1469.     cmpa.l    a1,a2
  1470.     bls    exit_qt
  1471.     move.w    (a1),d0
  1472.     sub.w    d3,d0
  1473.     move.w    (a1)+,d3
  1474.     tst.w    d0
  1475.     bpl    @f
  1476.     neg.w    d0
  1477. @@:
  1478.     cmpi.w    #lmt,d0
  1479.     bhi    get_tl_lp_
  1480.     move.l    a1,work1
  1481. get_tl_lp1_:
  1482.     cmpa.l    a1,a2
  1483.     bls    exit_qt
  1484.     move.w    (a1),d0
  1485.     sub.w    d3,d0
  1486.     move.w    (a1)+,d3
  1487.     tst.w    d0
  1488.     bpl    @f
  1489.     neg.w    d0
  1490. @@:
  1491.     cmpi.w    #lmt,d0
  1492.     bhi    get_tl_
  1493.     addq.l    #1,d1        *find=find+1
  1494.     cmpi.b    #meyasu*2,d1
  1495.     bcs    get_tl_lp1_
  1496.     move.l    work1(pc),d0
  1497.     subq.l    #2,d0
  1498.     move.l    d0,16(a0)    *save end
  1499.     bra    exit_qt
  1500.  
  1501. truncate:            *波形の切り出し
  1502.     movem.l    d6/a6,-(sp)
  1503.     bsr    get_pt1
  1504.     display2    cv_mes,%1110,41,15,14
  1505.  
  1506.     lea    address1(pc),a0
  1507.     clr.l    trn_rvs-address1(a0)
  1508.     tst.b    bank_sel
  1509.     beq    tr1
  1510.     tst.b    data_b        *データbある?
  1511.     beq    ext_tr
  1512.     lea    20(a0),a0        *bank_b
  1513.     bra    tr2
  1514. tr1:
  1515.     tst.b    data_a        *データaある?
  1516.     beq    ext_tr
  1517. tr2
  1518.     tst.b    bank_sel
  1519.     bne    tr__b
  1520.  
  1521.     tst.l    4(a0)
  1522.     bne    go_tr_pcm_a
  1523.     bsr    make_pcm_a
  1524.     bmi    ext_tr
  1525. go_tr_pcm_a:
  1526.     bsr    do_tr_pcm
  1527.  
  1528.     pea    (a0)        *push base addr
  1529.  
  1530.     tst.l    paddress(a0)
  1531.     bne    tr3
  1532.     bsr    make_adpcm_a
  1533.     bra    tr4
  1534. tr3:
  1535.     movea.l    4(a0),a1
  1536.     move.l    8(a0),d0
  1537.     movea.l    (a0),a0
  1538.     bsr    pcm_to_adpcm    *pcm data -> adpcm
  1539. tr4:
  1540.     move.l    (sp)+,a0
  1541.  
  1542.     move.l    psize(a0),-(sp)
  1543.     move.l    paddress(a0),-(sp)
  1544.     DOS    _SETBLOCK
  1545.     addq.w    #8,sp
  1546.  
  1547.     clr.l    12(a0)        *start_point
  1548.     clr.l    16(a0)        *end_point
  1549.     bsr    waku1
  1550.     bsr    init_hex_area_a
  1551.     movea.l    4(a0),a6    *a6=buffer
  1552.     move.l    8(a0),d6
  1553.     move.w    #scr_wy,genten_y
  1554.     bsr    dsp_wv
  1555.     bra    ext_tr
  1556. tr__b:
  1557.     tst.l    4(a0)
  1558.     bne    go_tr_pcm_b
  1559.     bsr    make_pcm_b
  1560.     bmi    ext_tr
  1561. go_tr_pcm_b:
  1562.     bsr    do_tr_pcm
  1563.  
  1564.     pea    (a0)        *push base addr.
  1565.  
  1566.     tst.l    paddress(a0)
  1567.     bne    tr5
  1568.     bsr    make_adpcm_b
  1569.     bra    tr6
  1570. tr5:
  1571.     movea.l    4(a0),a1
  1572.     move.l    8(a0),d0
  1573.     movea.l    (a0),a0
  1574.     bsr    pcm_to_adpcm    *pcm data -> adpcm
  1575. tr6:
  1576.     move.l    (sp)+,a0
  1577.  
  1578.     move.l    psize(a0),-(sp)
  1579.     move.l    paddress(a0),-(sp)
  1580.     DOS    _SETBLOCK
  1581.     addq.w    #8,sp
  1582.  
  1583.     clr.l    12(a0)        *start_point
  1584.     clr.l    16(a0)        *end_point
  1585.     bsr    waku2
  1586.     bsr    init_hex_area_b
  1587.     movea.l    4(a0),a6    *a6=buffer
  1588.     move.l    8(a0),d6
  1589.     move.w    #scr_wy+plus_,genten_y
  1590.     bsr    dsp_wv
  1591. ext_tr:
  1592.     bsr    put_pt1
  1593.     movem.l    (sp)+,d6/a6
  1594.     bra    m_lp
  1595.  
  1596. do_tr_pcm:            *実際にデータを転送
  1597.     tst.l    4(a0)
  1598.     beq    ext_do_tr
  1599.     tst.b    data_type
  1600.     beq    set_prm_tr
  1601.     bsr    calc_es
  1602.     addq.l    #2,trn_rvs
  1603. set_prm_tr:
  1604.     movea.l    12(a0),a1    *start point(src)
  1605.     movea.l    4(a0),a2    *buffer(dest)
  1606.     moveq.l    #%00000101,d1    *mode
  1607.     move.l    16(a0),d2    *end_point
  1608.     sub.l    a1,d2        *d1=n bytes
  1609.     addq.l    #2,d2
  1610.     add.l    trn_rvs(pc),d2
  1611.     move.l    d2,d6       *save size
  1612.     lsr.l    #2,d6
  1613.     move.l    d6,8(a0)
  1614.     bsr    trans_dma
  1615.  
  1616.     move.l    d2,-(sp)
  1617.     pea    (a2)
  1618.     DOS    _SETBLOCK
  1619.     addq.w    #8,sp
  1620. ext_do_tr:
  1621.     rts
  1622. calc_es:
  1623.     tst.b    bank_sel
  1624.     bne    calc_es0
  1625.     bsr    calc_es_pcm_a
  1626.     rts
  1627. calc_es0:
  1628.     bsr    calc_es_pcm_b
  1629.     rts
  1630.  
  1631. make_pcm_a:            *pcmデータを作る
  1632.     movem.l    d0-d7/a0-a6,-(sp)
  1633.     move.l    size1(pc),d1
  1634.     lsl.l    #2,d1            *d1=d1*4 pcmデータバッファは
  1635.     move.l    d1,-(sp)        *adpcmバッファの4倍の大きさが必要
  1636.     DOS    _MALLOC
  1637.     addq.w    #4,sp
  1638.     move.l    d0,mm_error
  1639.     bsr    print_em
  1640.     bmi    ext_mkpa        *case:error
  1641.     movea.l    d0,a1
  1642.     move.l    d0,buffer1
  1643.     move.l    address1(pc),a0
  1644.     move.l    size1(pc),d0
  1645.     bsr    just_adpcm_to_pcm
  1646.     moveq.l    #0,d0
  1647. ext_mkpa:
  1648.     tst.l    d0
  1649.     movem.l    (sp)+,d0-d7/a0-a6
  1650.     rts
  1651.  
  1652. make_pcm_b:            *pcmデータを作る
  1653.     movem.l    d0-d7/a0-a6,-(sp)
  1654.     move.l    size2(pc),d1
  1655.     lsl.l    #2,d1            *d1=d1*4 pcmデータバッファは
  1656.     move.l    d1,-(sp)        *adpcmバッファの4倍の大きさが必要
  1657.     DOS    _MALLOC
  1658.     addq.w    #4,sp
  1659.     move.l    d0,mm_error
  1660.     bsr    print_em
  1661.     bmi    ext_mkpb        *case:error
  1662.     movea.l    d0,a1
  1663.     move.l    d0,buffer2
  1664.     move.l    address2(pc),a0
  1665.     move.l    size2(pc),d0
  1666.     bsr    just_adpcm_to_pcm
  1667.     moveq.l    #0,d0
  1668. ext_mkpb:
  1669.     tst.l    d0
  1670.     movem.l    (sp)+,d0-d7/a0-a6
  1671.     rts
  1672.  
  1673. ast_ope:            *データ表示モードチェンジ
  1674.     pea    m_lp(pc)
  1675.     not.b    prt_md
  1676.     movem.l    d0-d7/a0-a6,-(sp)
  1677.     moveq.l    #3,d6
  1678. ast_lp:
  1679.     moveq.l    #'5',d0
  1680.     bsr    data_move_
  1681.     dbra    d6,ast_lp
  1682.     movem.l    (sp)+,d0-d7/a0-a6
  1683.     bra    ext_dtp
  1684.  
  1685. data_move?:
  1686.     pea    m_lp(pc)    *帰還先をプッシュ(z80みたい…)
  1687. data_move_:
  1688.     tst.b    data_type
  1689.     beq    case_dt_PCM
  1690.                 *ADPCMデータの場合
  1691.     moveq.l    #16,d4
  1692.     sftsns    d2
  1693.     btst.l    #1,d2        *[ctrl] check
  1694.     beq    @f
  1695.     move.l    #1024,d4
  1696. @@:
  1697.     moveq.l    #1,d2
  1698.     bra    which_point
  1699.  
  1700. case_dt_PCM:            *PCMデータの場合
  1701.     moveq.l    #32,d4
  1702.     sftsns    d2
  1703.     btst.l    #1,d2        *[ctrl] check
  1704.     beq    @f
  1705.     move.l    #2048,d4
  1706. @@:
  1707.     moveq.l    #2,d2
  1708. which_point:
  1709. stpt1?:                *start point bank a
  1710.     tst.b    d6
  1711.     bne    edpt1?
  1712.     tst.b    data_a
  1713.     beq    ext_dtp
  1714.     moveq.l    #11,d3        *set y
  1715.     lea    1.w,a6        *単にデータレジスタとして使っているだけ(以下同じ)
  1716.     lea    address1(pc),a1
  1717.     bsr    ope_stp
  1718.     tst.b    data_type
  1719.     beq    @f
  1720.     tst.l    address1
  1721.     bne    sv_stpt1
  1722.     bra    exit_stpt1
  1723. @@:
  1724.     tst.l    buffer1
  1725.     beq    exit_stpt1
  1726. sv_stpt1:
  1727.     move.l    a2,start_point1
  1728. exit_stpt1:
  1729. ofsst1:                *オフセット値表示
  1730.     move.l    start_point1(pc),d0
  1731.     tst.b    data_type
  1732.     bne    @f
  1733.     sub.l    buffer1(pc),d0
  1734.     bra    _ts0
  1735. @@:
  1736.     sub.l    address1(pc),d0
  1737. _ts0:
  1738.     bsr    num_to_str
  1739.     display2    suji,%0011,41,0,10
  1740.  
  1741.     move.l    end_point1(pc),d0
  1742.     tst.b    data_type
  1743.     bne    @f
  1744.     sub.l    start_point1(pc),d0
  1745.     bcs    _ts2
  1746.     addq.l    #2,d0
  1747.     bra    _ts1
  1748. @@:
  1749.     sub.l    start_point1(pc),d0
  1750.     bcs    _ts2
  1751.     addq.l    #1,d0
  1752. _ts1:
  1753.     bsr    num_to_str
  1754.     display2    suji,%0011,83,0,10
  1755. _ts2:
  1756.     rts
  1757.  
  1758. edpt1?:
  1759.     cmpi.b    #1,d6
  1760.     bne    stpt2?
  1761.     tst.b    data_a
  1762.     beq    ext_dtp
  1763.     moveq.l    #12,d3        *set y
  1764.     lea    1.w,a6
  1765.     lea    address1(pc),a1
  1766.     bsr    ope_edp
  1767.     tst.b    data_type
  1768.     beq    @f
  1769.     tst.l    address1
  1770.     bne    sv_edpt1
  1771.     bra    exit_edpt1
  1772. @@:
  1773.     tst.l    buffer1
  1774.     beq    exit_edpt1
  1775. sv_edpt1:
  1776.     move.l    a2,end_point1
  1777. exit_edpt1:
  1778. ofsed1:                *オフセット値表示
  1779.     move.l    end_point1(pc),d0
  1780.     tst.b    data_type
  1781.     bne    @f
  1782.     sub.l    buffer1(pc),d0
  1783.     bra    _ts3
  1784. @@:
  1785.     sub.l    address1(pc),d0
  1786. _ts3:
  1787.     bsr    num_to_str
  1788.     display2    suji,%0011,60,0,10
  1789.  
  1790.     move.l    end_point1(pc),d0
  1791.     tst.b    data_type
  1792.     bne    @f
  1793.     sub.l    start_point1(pc),d0
  1794.     bcs    _ts5
  1795.     addq.l    #2,d0
  1796.     bra    _ts4
  1797. @@:
  1798.     sub.l    start_point1(pc),d0
  1799.     bcs    _ts5
  1800.     addq.l    #1,d0
  1801. _ts4:
  1802.     bsr    num_to_str
  1803.     display2    suji,%0011,83,0,10
  1804. _ts5:
  1805.     rts
  1806.  
  1807. stpt2?:
  1808.     cmpi.b    #2,d6
  1809.     bne    edpt2?
  1810.     tst.b    data_b
  1811.     beq    ext_dtp
  1812.     moveq.l    #25,d3        *set y
  1813.     lea    plus_+1,a6
  1814.     lea    address2(pc),a1
  1815.     bsr    ope_stp
  1816.     tst.b    data_type
  1817.     beq    @f
  1818.     tst.l    address2
  1819.     bne    sv_stpt2
  1820.     bra    exit_stpt2
  1821. @@:
  1822.     tst.l    buffer2
  1823.     beq    exit_stpt2
  1824. sv_stpt2:
  1825.     move.l    a2,start_point2
  1826. exit_stpt2:
  1827. ofsst2:                *オフセット値表示
  1828.     move.l    start_point2(pc),d0
  1829.     tst.b    data_type
  1830.     bne    @f
  1831.     sub.l    buffer2(pc),d0
  1832.     bra    _ts6
  1833. @@:
  1834.     sub.l    address2(pc),d0
  1835. _ts6:
  1836.     bsr    num_to_str
  1837.     display2    suji,%0011,41,14,10
  1838.  
  1839.     move.l    end_point2(pc),d0
  1840.     tst.b    data_type
  1841.     bne    @f
  1842.     sub.l    start_point2(pc),d0
  1843.     bcs    _ts8
  1844.     addq.l    #2,d0
  1845.     bra    _ts7
  1846. @@:
  1847.     sub.l    start_point2(pc),d0
  1848.     bcs    _ts8
  1849.     addq.l    #1,d0
  1850. _ts7:
  1851.     bsr    num_to_str
  1852.     display2    suji,%0011,83,14,10
  1853. _ts8:
  1854.     rts
  1855.  
  1856. edpt2?:
  1857.     cmpi.b    #3,d6
  1858.     bne    ext_dtp        *メインループ帰還
  1859.     tst.b    data_b
  1860.     beq    ext_dtp
  1861.     moveq.l    #26,d3        *set y
  1862.     lea    plus_+1,a6
  1863.     lea    address2(pc),a1
  1864.     bsr    ope_edp
  1865.     tst.b    data_type
  1866.     beq    @f
  1867.     tst.l    address2
  1868.     bne    sv_edpt2
  1869.     bra    exit_edpt2
  1870. @@:
  1871.     tst.l    buffer2
  1872.     beq    exit_edpt2
  1873. sv_edpt2:
  1874.     move.l    a2,end_point2
  1875. exit_edpt2:
  1876. ofsed2:                *オフセット値表示
  1877.     move.l    end_point2(pc),d0
  1878.     tst.b    data_type
  1879.     bne    @f
  1880.     sub.l    buffer2(pc),d0
  1881.     bra    _ts9
  1882. @@:
  1883.     sub.l    address2(pc),d0
  1884. _ts9:
  1885.     bsr    num_to_str
  1886.     display2    suji,%0011,60,14,10
  1887.  
  1888.     move.l    end_point2(pc),d0
  1889.     tst.b    data_type
  1890.     bne    @f
  1891.     sub.l    start_point2(pc),d0
  1892.     bcs    _ts11
  1893.     addq.l    #2,d0
  1894.     bra    _ts10
  1895. @@:
  1896.     sub.l    start_point2(pc),d0
  1897.     bcs    _ts11
  1898.     addq.l    #1,d0
  1899. _ts10:
  1900.     bsr    num_to_str
  1901.     display2    suji,%0011,83,14,10
  1902. _ts11:
  1903.     rts
  1904.  
  1905. ope_stp:
  1906.     move.l    psize(a1),d5
  1907.     tst.b    data_type
  1908.     beq    stpt1_buf
  1909.     movea.l    paddress(a1),a3
  1910.     lea    -1(a3,d5.l),a4    *end addr
  1911.     bra    st1
  1912. stpt1_buf:
  1913.     movea.l    pbuffer(a1),a3
  1914.     lsl.l    #2,d5
  1915.     lea    -2(a3,d5.l),a4    *end addr
  1916. st1:
  1917.     move.l    pstart(a1),d1
  1918.     movea.l    d1,a2
  1919.     bne    go_kchk_st1
  1920.     lea    (a3),a2
  1921. go_kchk_st1:
  1922.     lea    (a3),a0        *a0=start
  1923.     move.l    pend(a1),d1
  1924.     movea.l    d1,a5
  1925.     bne    st1_
  1926.     lea    (a4),a5        *a5=end
  1927. st1_:
  1928.     bra    k_chk
  1929.  
  1930. ope_edp:
  1931.     move.l    psize(a1),d5
  1932.     tst.b    data_type
  1933.     beq    edpt1_buf
  1934.     movea.l    paddress(a1),a3
  1935.     lea    -1(a3,d5.l),a4
  1936.     bra    ed1
  1937. edpt1_buf:
  1938.     movea.l    pbuffer(a1),a3
  1939.     lsl.l    #2,d5
  1940.     lea    -2(a3,d5.l),a4
  1941. ed1:
  1942.     move.l    pend(a1),d1
  1943.     movea.l    d1,a2
  1944.     bne    go_kchk_ed1
  1945.     lea    (a3),a2
  1946. go_kchk_ed1:
  1947.     lea    (a4),a5        *a5=end
  1948.     move.l    pstart(a1),d1
  1949.     movea.l    d1,a0        *a0=start
  1950.     bne    ed1_
  1951.     lea    (a3),a0
  1952. ed1_:
  1953. *    bra    k_chk
  1954.  
  1955. k_chk:                *キー入力チェック
  1956.     moveq.l    #0,d1
  1957.     move.b    d0,d1
  1958.     sub.b    #$30,d1
  1959.     bmi    kchk_period
  1960.     cmpi.b    #9,d1
  1961.     bhi    kchk_period
  1962.     add.w    d1,d1
  1963.     move.w    k_j_tbl(pc,d1.w),a1
  1964.     jmp    k_j_tbl(pc,a1.w)
  1965.  
  1966. k_j_tbl:    dc.w    kchk0-k_j_tbl
  1967.         dc.w    kchk1-k_j_tbl,ext_dtp-k_j_tbl,kchk3-k_j_tbl
  1968.         dc.w    kchk4-k_j_tbl,kchk5-k_j_tbl,kchk6-k_j_tbl
  1969.         dc.w    kchk7-k_j_tbl,ext_dtp-k_j_tbl,kchk9-k_j_tbl
  1970.  
  1971. chk_edge1    macro
  1972.     local    abc
  1973.     move.l    a3,d0
  1974.     btst.l    #0,d3
  1975.     bne    abc
  1976.     add.l    d2,d0
  1977. abc:
  1978.     endm
  1979.  
  1980. chk_edge2    macro
  1981.     local    abc
  1982.     move.l    a4,d0
  1983.     btst.l    #0,d3
  1984.     beq    abc
  1985.     sub.l    d2,d0
  1986. abc:
  1987.     endm
  1988.  
  1989. *    a3=start address
  1990. *    a4=end address
  1991. kchk4:
  1992.     chk_edge1
  1993.     cmpa.l    d0,a2
  1994.     beq    ext_dtp
  1995.     suba.l    d2,a2
  1996.     bra    do_disp_dt
  1997. kchk6:
  1998.     chk_edge2
  1999.     cmpa.l    d0,a2
  2000.     beq    ext_dtp
  2001.     adda.l    d2,a2
  2002.     bra    do_disp_dt
  2003. kchk1:
  2004.     lea    (a2),a1
  2005.     move.l    d5,d4
  2006.     lsr.l    #5,d4
  2007.     bclr.l    #0,d4
  2008.     tst.l    d4
  2009.     bne    k1__
  2010.     move.l    d2,d4
  2011. k1__:
  2012.     suba.l    d4,a1
  2013.     chk_edge1
  2014.     cmp.l    a1,d0
  2015.     bge    copy_d0        *スタートに帰る
  2016.     lea    (a1),a2
  2017.     bra    do_disp_dt
  2018. kchk3:
  2019.     move.l    d5,d4
  2020.     lsr.l    #5,d4
  2021.     bclr.l    #0,d4
  2022.     tst.l    d4
  2023.     bne    k3__
  2024.     move.l    d2,d4
  2025. k3__:
  2026.     lea    (a2,d4.l),a1
  2027.     chk_edge2
  2028.     cmp.l    a1,d0
  2029.     ble    copy_d0        *エンドにする
  2030.     lea    (a1),a2
  2031.     bra    do_disp_dt
  2032. kchk7:
  2033.     lea    (a2),a1
  2034.     suba.l    d4,a1
  2035.     chk_edge1
  2036.     cmp.l    a1,d0
  2037.     bge    copy_d0        *スタートに帰る
  2038.     lea    (a1),a2
  2039.     bra    do_disp_dt
  2040. kchk9:
  2041.     lea    (a2,d4.l),a1
  2042.     chk_edge2
  2043.     cmp.l    a1,d0
  2044.     ble    copy_d0        *エンドにする
  2045.     lea    (a1),a2
  2046.     bra    do_disp_dt
  2047. kchk0:
  2048.     lea    (a3),a2
  2049.     btst.l    #0,d3
  2050.     bne    do_disp_dt    *case start p
  2051.     add.l    d2,a2
  2052.     bra    do_disp_dt
  2053. copy_d0:
  2054.     move.l    d0,a2
  2055.     bra    do_disp_dt
  2056.  
  2057. kchk5:                *単なる表示(init_hex_areaで使用)
  2058.     cmpa.l    a2,a4
  2059.     ble    kchk_pd_    *エンドにする
  2060.     cmpa.l    a2,a3
  2061.     bge    kchk0        *スタートに帰る
  2062.     bra    do_disp_dt
  2063.  
  2064. kchk_period:
  2065.     cmpi.b    #'.',d0
  2066.     bne    kchk_cmm
  2067. kchk_pd_:
  2068.     lea    (a4),a2
  2069.     btst.l    #0,d3
  2070.     beq    do_disp_dt    *case start p
  2071.     sub.l    d2,a2
  2072.     bra    do_disp_dt
  2073. kchk_cmm:
  2074.     cmpi.b    #',',d0
  2075.     bne    ext_dtp
  2076.     move.l    d5,d1
  2077.     lsr.l    d1
  2078.     bclr.l    #0,d1
  2079.     lea    (a3,d1.l),a2    *真ん中に…
  2080.     bra    do_disp_dt
  2081.  
  2082. do_disp_dt:
  2083.     move.l    a3,d0
  2084.     beq    ext_dtp        *dataがない
  2085.     cmpa.l    a0,a2
  2086.     bcc    ddd1
  2087.     lea    (a0,d2.w),a2
  2088.     bra    ddd2
  2089. ddd1:
  2090.     cmpa.l    a5,a2
  2091.     bls    ddd2
  2092.     move.l    a5,a2
  2093.     sub.l    d2,a2
  2094. ddd2:
  2095.     tst.b    data_type
  2096.     beq    dt_print16
  2097.  
  2098.     *ADPCMのデータのケース
  2099. dt_print8:
  2100.     * < d3=y座標
  2101.     * < a2=middle print point addr.
  2102.     lea    prt_bf(pc),a1
  2103.     lea    -13(a2),a2
  2104.     moveq.l    #27-1,d2    *number of disp.
  2105. prtd8_lp:
  2106.     cmpa.l    a2,a3
  2107.     bhi    prt_ast8
  2108.     cmpa.l    a2,a4
  2109.     bcs    prt_ast8
  2110.     move.b    (a2),d0
  2111.     bsr    get_hex8
  2112.     addq.w    #2,a1
  2113.     move.b    #' ',(a1)+
  2114. prtd8_lp0:
  2115.     addq.w    #1,a2        *ad=ad+1.b
  2116.     dbra    d2,prtd8_lp
  2117.     moveq.l    #%0011,d1    *atr
  2118.     moveq.l    #14,d2        *print start x
  2119.     moveq.l    #27*3-1,d4    *len
  2120.     lea    prt_bf(pc),a1
  2121.     IOCS    _B_PUTMES
  2122.     lea    -14(a2),a2    *入力時の値に戻す
  2123.     bra    tate_sen_
  2124. ext_dtp:
  2125.     rts
  2126. prt_ast8:
  2127.     move.b    #'*',(a1)+
  2128.     move.b    #'*',(a1)+
  2129.     move.b    #' ',(a1)+
  2130.     bra    prtd8_lp0
  2131.  
  2132. get_hex8:            *値→16進数文字列(2bytes)
  2133.     * < d0=data value
  2134.     * < a1=格納したいアドレス
  2135.     * > (a1)=ascii numbers
  2136.     * X d0,d1,d4,a1
  2137.     addq.w    #2,a1
  2138.     clr.b    (a1)
  2139.     move.b    d0,d1
  2140.     andi.b    #$0f,d1
  2141.     add.b    #$30,d1
  2142.     cmpi.b    #'9',d1
  2143.     bls    its_hex8
  2144.     addq.b    #7,d1
  2145. its_hex8:
  2146.     move.b    d1,-(a1)
  2147.     lsr.b    #4,d0
  2148.  
  2149.     add.b    #$30,d0
  2150.     cmpi.b    #'9',d0
  2151.     bls    its_hex8_
  2152.     addq.b    #7,d0
  2153. its_hex8_:
  2154.     move.b    d0,-(a1)
  2155.     rts
  2156.  
  2157. tate_sen_:        *赤い縦線を引く
  2158.     * < a2=pointer
  2159.     * < a3=adress/buffer
  2160.     move.l    a2,d1
  2161.     sub.l    a3,d1
  2162.     move.l    d5,d2
  2163. @@:
  2164.     btst.l    #0,d1
  2165.     bne    @f
  2166.     btst.l    #0,d2
  2167.     bne    @f
  2168.     lsr.l    d1
  2169.     lsr.l    d2
  2170.     bra    @b
  2171. @@:
  2172.     move.l    #scr_wx,d0
  2173.     bsr    kake        *d0.l*d1.l=d1.l
  2174.     bsr    wari        *d1=d1/d2(d5)=(760*point)/size...d2
  2175.     tst.l    d2
  2176.     beq    plus_ofs
  2177.     addq.l    #1,d1        *余りがあるなら… +1
  2178. plus_ofs:
  2179.     add.w    #start_x,d1    *offset
  2180.     move.l    d1,d0        *x
  2181.     move.l    a6,d1        *y
  2182.  
  2183.     cmpi.b    #11,d3
  2184.     bne    tate_0
  2185.     movea.l    last_txt_adas(pc),a0
  2186.     lea    $e40000,a1
  2187.     bsr    txt_ln
  2188.     move.l    a0,last_txt_adas
  2189.     rts
  2190. tate_0:
  2191.     cmpi.b    #12,d3
  2192.     bne    tate_1
  2193.     movea.l    last_txt_adae(pc),a0
  2194.     lea    $e60000,a1
  2195.     bsr    txt_ln
  2196.     move.l    a0,last_txt_adae
  2197.     rts
  2198. tate_1:
  2199.     cmpi.b    #25,d3
  2200.     bne    tate_2
  2201.     movea.l    last_txt_adbs(pc),a0
  2202.     lea    $e40000,a1
  2203.     bsr    txt_ln
  2204.     move.l    a0,last_txt_adbs
  2205.     rts
  2206. tate_2:
  2207.     movea.l    last_txt_adbe(pc),a0
  2208.     lea    $e60000,a1
  2209.     bsr    txt_ln
  2210.     move.l    a0,last_txt_adbe
  2211.     rts
  2212.  
  2213. dt_print16:
  2214.     * < d3=y座標
  2215.     * < a2=middle print point addr.
  2216.     lea    prt_bf(pc),a1
  2217.     lea    -16(a2),a2
  2218.     moveq.l    #17-1,d2    *number of disp.
  2219.     moveq.l    #0,d0
  2220. prtd16_lp:
  2221.     cmpa.l    a2,a3
  2222.     bhi    prt_ast
  2223.     cmpa.l    a2,a4
  2224.     bcs    prt_ast
  2225.     move.w    (a2),d0
  2226.     tst.b    prt_md
  2227.     beq    pl_only
  2228.     bsr    get_bcd
  2229.     bra    inc_ptr
  2230. pl_only:
  2231.     bsr    get_hex
  2232.     addq.w    #4,a1
  2233. inc_ptr:
  2234.     move.b    #' ',(a1)+
  2235. prtd16_lp0:
  2236.     addq.w    #2,a2        *ad=ad+1.w
  2237.     dbra    d2,prtd16_lp
  2238.     moveq.l    #%0011,d1    *atr
  2239.     moveq.l    #12,d2        *print start x
  2240.     moveq.l    #17*5-1,d4    *len
  2241.     lea    prt_bf(pc),a1
  2242.     IOCS    _B_PUTMES
  2243.     lea    -18(a2),a2    *入力時の値に戻す
  2244.     bra    tate_sen_
  2245.  
  2246. prt_ast:
  2247.     move.b    #'*',(a1)+
  2248.     move.b    #'*',(a1)+
  2249.     move.b    #'*',(a1)+
  2250.     move.b    #'*',(a1)+
  2251.     move.b    #' ',(a1)+
  2252.     bra    prtd16_lp0
  2253.  
  2254. get_hex:            *値→16進数文字列(2bytes)
  2255.     * < d0=data value
  2256.     * < a1=格納したいアドレス
  2257.     * > (a1)=ascii numbers
  2258.     * X d0,d1,d4,a1
  2259.     addq.w    #4,a1
  2260.     clr.b    (a1)
  2261.     moveq.l    #3,d4
  2262. gh_lp:
  2263.     move.b    d0,d1
  2264.     andi.b    #$0f,d1
  2265.     add.b    #$30,d1
  2266.     cmpi.b    #'9',d1
  2267.     bls    its_hex
  2268.     addq.b    #7,d1
  2269. its_hex:
  2270.     move.b    d1,-(a1)
  2271.     lsr.w    #4,d0
  2272.     dbra    d4,gh_lp
  2273.     rts
  2274.  
  2275. get_bcd:            *値→16進数文字列(2bytes)マイナス値も生成
  2276.     * < d0=data value
  2277.     * < a1=格納したいアドレス
  2278.     * > (a1)=ascii numbers
  2279.     * X d0,d1,d4,a1
  2280.     tst.w    d0
  2281.     smi    pl_mi
  2282.     bpl    chk_big
  2283.     neg.w    d0
  2284. chk_big:
  2285.     cmpi.w    #9999,d0
  2286.     bls    clr_hjm
  2287.     move.l    #9999,d0
  2288. clr_hjm:
  2289.     clr.b    hajimete
  2290.     move.l    #1000,d1
  2291. gbcd_lp:
  2292.     divu    d1,d0
  2293.     move.b    d0,d4
  2294.     clr.w    d0
  2295.     swap    d0
  2296.     tst.b    d4
  2297.     bne    set_1bcd
  2298.     tst.b    hajimete
  2299.     bne    set_1bcd
  2300.     move.b    #$20,(a1)+
  2301.     bra    lp_ope
  2302. set_1bcd:
  2303.     tst.b    hajimete
  2304.     bne    add_0
  2305.     tst.b    pl_mi
  2306.     bpl    reset_hjm
  2307.     move.b    #'-',-(a1)
  2308.     addq.w    #1,a1
  2309. reset_hjm:
  2310.     st    hajimete
  2311. add_0:
  2312.     add.b    #'0',d4
  2313.     move.b    d4,(a1)+
  2314. lp_ope:
  2315.     divu    #10,d1
  2316.     tst.w    d1
  2317.     bne    gbcd_lp
  2318.     tst.b    hajimete
  2319.     bmi    bye_gbcd
  2320.     move.b    #'0',-1(a1)
  2321. bye_gbcd:
  2322.     rts
  2323.  
  2324. get_hex32:            *値→16進数文字列(4bytes)
  2325.     * < d0=data value
  2326.     * < a1=格納したいアドレス
  2327.     * > (a1)=ascii numbers
  2328.     * X d0,d1,d4,a1
  2329.     movem.l    d0-d1/d4/a1,-(sp)
  2330.     addq.w    #8,a1
  2331.     clr.b    (a1)
  2332.     moveq.l    #8-1,d4
  2333. gh_lp32:
  2334.     move.b    d0,d1
  2335.     andi.b    #$0f,d1
  2336.     add.b    #$30,d1
  2337.     cmpi.b    #'9',d1
  2338.     bls    its_hex32
  2339.     addq.b    #7,d1
  2340. its_hex32:
  2341.     move.b    d1,-(a1)
  2342.     lsr.l    #4,d0
  2343.     dbra    d4,gh_lp32
  2344.     movem.l    (sp)+,d0-d1/d4/a1
  2345.     rts
  2346.  
  2347. kake:            *32ビット×32ビット=32ビット
  2348.     * < d0.l X d1.l
  2349.     * > d1.l
  2350.     * - all
  2351.     movem.l    d0/d2-d4,-(sp)
  2352.     move.l    d0,d2
  2353.     move.l    d1,d3
  2354.     swap    d2
  2355.     swap    d3
  2356.  
  2357.     move.w    d1,d4
  2358.     mulu    d0,d1
  2359.     mulu    d3,d0
  2360.     mulu    d2,d3
  2361.     mulu    d4,d2
  2362.     exg    d0,d3
  2363.  
  2364.     add.l    d3,d2
  2365.  
  2366.     move.w    d2,d3
  2367.     swap    d3
  2368.     clr.w    d3
  2369.  
  2370.     clr.w    d2
  2371.     addx.w    d3,d2
  2372.     swap    d2
  2373.  
  2374.     add.l    d3,d1
  2375.     addx.l    d2,d0
  2376.     movem.l    (sp)+,d0/d2-d4
  2377.     rts
  2378.  
  2379. wari:                *32ビット/32ビット=32ビット...32ビット
  2380.     * < d1.l/d2.l=d1.l ...d2.l
  2381.     cmpi.l    #$ffff,d2
  2382.     bls    divx        *16ビット以下の数値なら1命令で処理
  2383.     cmp.l    d1,d2
  2384.     beq    div01        *d1=d2商は1
  2385.     bls    div02        *1命令では無理なケース
  2386.  
  2387.     move.l    d1,d2        *商は0余りはd1.l
  2388.     moveq.l    #0,d1
  2389.     rts
  2390. div01:                *商は1余り0
  2391.     moveq.l    #1,d1
  2392.     moveq.l    #0,d2
  2393.     rts
  2394. div02:
  2395.     movem.l    d3-d5,-(sp)
  2396.     move.l    d2,d3
  2397.     clr.w    d3
  2398.     swap    d3
  2399.     addq.l    #1,d3
  2400.     move.l    d1,d4
  2401.     move.l    d2,d5
  2402.     move.l    d3,d2
  2403.     bsr    divx
  2404.     move.l    d5,d2
  2405.     divu    d3,d2
  2406.     divu    d2,d1
  2407.     andi.l    #$ffff,d1
  2408. div03:
  2409.     move.l    d5,d2
  2410.     move.l    d5,d3
  2411.     swap    d3
  2412.     mulu    d1,d2
  2413.     mulu    d1,d3
  2414.     swap    d3
  2415.     add.l    d3,d2
  2416.     sub.l    d4,d2
  2417.     bhi    div04
  2418.     neg.l    d2
  2419.     cmp.l    d2,d5
  2420.     bhi    div05
  2421.     addq.l    #1,d1
  2422.     bra    div03
  2423. div04:
  2424.     subq.l    #1,d1
  2425.     bra    div03
  2426. div05:
  2427.     movem.l    (sp)+,d3-d5
  2428.     rts
  2429. divx:
  2430.     movem.w    d1/d3,-(sp)
  2431.     clr.w    d1
  2432.     swap    d1
  2433.     divu    d2,d1
  2434.     move.w    d1,d3
  2435.     move.w    (sp)+,d1
  2436.     divu    d2,d1
  2437.     swap    d1
  2438.     moveq.l    #0,d2
  2439.     move.w    d1,d2
  2440.     move.w    d3,d1
  2441.     swap    d1
  2442.     move.w    (sp)+,d3
  2443.     rts
  2444.  
  2445. bank_change:                *アクセスバンクの切り換え
  2446.     moveq.l    #0,d7
  2447.     not.b    bank_sel
  2448.     bsr    _bank_a
  2449.     bsr    _bank_b
  2450.     bra    m_lp
  2451. bank_change_a:
  2452.     st    bank_sel
  2453.     bra    bank_change
  2454. bank_change_b:
  2455.     clr.b    bank_sel
  2456.     bra    bank_change
  2457.  
  2458. M_ON:                    *MONITOR機能のオン/オフ
  2459.     moveq.l    #0,d7
  2460.  
  2461.     move.w    sr,-(sp)
  2462.     ori.w    #$0700,sr
  2463.     move.b    #$10,CCR3    *dma stop
  2464.     st    CSR3        *status clear
  2465.     move.b    #$88,$e92003
  2466.     clr.b    DMADSTAT.w
  2467.     move.w    (sp)+,sr
  2468.  
  2469. *    bsr    set_pan_frq
  2470.  
  2471.     move.b    monitor_mode(pc),d0
  2472.     not.b    d0            *0=off 1=on
  2473.     move.b    d0,-(sp)
  2474.     beq    Moff
  2475. Mon:
  2476.     move.b    #%0000_0100,$e92001    *adpcm rec start
  2477.     bra    M01
  2478. Moff:
  2479.     move.b    #%0000_0001,$e92001    *adpcm all end
  2480. M01:
  2481.     move.b    (sp)+,d0
  2482.     bsr    mt_on_off
  2483.     bra    complete
  2484.  
  2485. _OUT:                    *パンポット
  2486.     moveq.l    #0,d7
  2487.  
  2488.     moveq.l    #0,d0
  2489.     move.b    out_assign(pc),d0
  2490.     addq.b    #1,d0
  2491.     cmpi.b    #4,d0
  2492.     bne    ok_pan
  2493.     moveq.l    #0,d0
  2494. ok_pan:
  2495.     move.b    d0,last_param+1            *ワークはXAPNEL部と共用
  2496.     bsr    pan_pot
  2497.     bsr    set_pan_frq
  2498.     bra    complete
  2499.  
  2500. _AUTO_:                    *オートサンプリング機能の有無
  2501.     moveq.l    #0,d7
  2502.     move.b    trigger(pc),d0
  2503.     not.b    d0
  2504.     bsr    trg_on_off
  2505.     move.b    trigger(pc),d0
  2506.     beq    complete
  2507.     clr.b    monitor_mode
  2508.     bra    M_ON
  2509.  
  2510. _chg_type:                *表示データの形式を変える
  2511.     moveq.l    #0,d7
  2512.     move.b    data_type(pc),d0
  2513.     not.b    d0
  2514.     bsr    dt_type
  2515.     bsr    get_pt1
  2516.     bsr    chg_tp_a
  2517.     bsr    chg_tp_b
  2518.     bsr    put_pt1
  2519.     bra    complete
  2520.  
  2521. dsp_cv_mes:
  2522.     movem.l    d0-d4/a1,-(sp)
  2523.     display2    cv_mes,%1110,41,15,14
  2524.     movem.l    (sp)+,d0-d4/a1
  2525.     rts
  2526.  
  2527. chg_tp_a:                *adpcm data -> pcm data(初めての時)
  2528.     tst.b    data_a
  2529.     beq    ext_chg_tp        *データエリアに何もない…
  2530.     tst.b    data_type
  2531.     bne    ad_ready_a?
  2532.     move.l    buffer1(pc),d0
  2533.     bne    hosei_a            *pcmデータはある
  2534.     bsr    dsp_cv_mes
  2535.     bsr    make_pcm_a
  2536.     bmi    hosei_a            *case:error
  2537. *    movem.l    d0-d7/a0-a6,-(sp)
  2538. *    move.l    size1(pc),d6
  2539. *    movea.l    buffer1(pc),a6
  2540. *    move.w    #scr_wy,genten_y
  2541. *    bsr    waku1
  2542. *    bsr    dsp_wv
  2543. *    movem.l    (sp)+,d0-d7/a0-a6
  2544. hosei_a:
  2545.     bsr    calc_es_pcm_a
  2546.     bsr    init_hex_area_a
  2547.     rts
  2548. ad_ready_a?:            *pcm data をadpcm dataへ(初めての時)
  2549.     move.l    address1(pc),d0
  2550.     bne    adrd_a0        *両方あるよ
  2551.     bsr    dsp_cv_mes
  2552.     bsr    make_adpcm_a
  2553. *    bmi    ext_chg_tp        *case:error
  2554. adrd_a0:
  2555.     bsr    calc_es_adpcm_a
  2556.     bsr    init_hex_area_a
  2557.     rts
  2558.  
  2559. chg_tp_b:            *pcm -> adpcm (初めての時)
  2560.     tst.b    data_b
  2561.     beq    ext_chg_tp    *データエリアに何もない…
  2562.     tst.b    data_type
  2563.     bne    ad_ready_b?
  2564.     move.l    buffer2(pc),d0
  2565.     bne    hosei_b            *pcmデータはある
  2566.     bsr    dsp_cv_mes
  2567.     bsr    make_pcm_b
  2568.     bmi    hosei_b            *case:error
  2569. *    movem.l    d0-d7/a0-a6,-(sp)
  2570. *    move.l    size2(pc),d6
  2571. *    movea.l    buffer2(pc),a6
  2572. *    move.w    #scr_wy+plus_,genten_y
  2573. *    bsr    waku2
  2574. *    bsr    dsp_wv
  2575. *    movem.l    (sp)+,d0-d7/a0-a6
  2576. hosei_b:
  2577.     bsr    calc_es_pcm_b
  2578.     bsr    init_hex_area_b
  2579. ext_chg_tp:
  2580.     rts
  2581.  
  2582. ad_ready_b?:            *pcm dataをadpcm dataへ(初めての時)
  2583.     move.l    address2(pc),d0
  2584.     bne    adrd_b0        *両方あるよ
  2585.     bsr    dsp_cv_mes
  2586.     bsr    make_adpcm_b
  2587. *    bmi    ext_chg_tp        *case:error
  2588. adrd_b0:
  2589.     bsr    calc_es_adpcm_b
  2590.     bsr    init_hex_area_b
  2591.     bra    ext_chg_tp
  2592.  
  2593. calc_es_pcm_a:            *end_point,start_pointの計算
  2594.     movem.l    d0-d1,-(sp)
  2595.     move.l    start_point1(pc),d0
  2596.     beq    cepa1
  2597.     move.l    address1(pc),d1
  2598.     beq    cepa1
  2599.     sub.l    d1,d0
  2600.     lsl.l    #2,d0
  2601.     move.l    buffer1(pc),d1
  2602.     beq    cepa1
  2603.     add.l    d1,d0
  2604.     move.l    d0,start_point1
  2605.  
  2606.     move.l    end_point1(pc),d0
  2607.     sub.l    address1(pc),d0
  2608.     lsl.l    #2,d0
  2609.     add.l    buffer1(pc),d0
  2610.     move.l    d0,end_point1
  2611. cepa1:
  2612.     movem.l    (sp)+,d0-d1
  2613.     rts
  2614. calc_es_adpcm_a:        *start_point,end_pintの計算
  2615.     movem.l    d0-d1,-(sp)
  2616.     move.l    start_point1(pc),d0
  2617.     beq    ceaa1
  2618.     move.l    buffer1(pc),d1
  2619.     beq    ceaa1
  2620.     sub.l    d1,d0
  2621.     lsr.l    #2,d0
  2622.     move.l    address1(pc),d1
  2623.     beq    ceaa1
  2624.     add.l    d1,d0
  2625.     move.l    d0,start_point1
  2626.  
  2627.     move.l    end_point1(pc),d0
  2628.     sub.l    buffer1(pc),d0
  2629.     lsr.l    #2,d0
  2630.     add.l    address1(pc),d0
  2631.     move.l    d0,end_point1
  2632. ceaa1:
  2633.     movem.l    (sp)+,d0-d1
  2634.     rts
  2635. calc_es_pcm_b:
  2636.     movem.l    d0-d1,-(sp)
  2637.     move.l    start_point2(pc),d0
  2638.     beq    cepb1
  2639.     move.l    address2(pc),d1
  2640.     beq    cepb1
  2641.     sub.l    d1,d0
  2642.     lsl.l    #2,d0
  2643.     move.l    buffer2(pc),d1
  2644.     beq    cepb1
  2645.     add.l    d1,d0
  2646.     move.l    d0,start_point2
  2647.  
  2648.     move.l    end_point2(pc),d0
  2649.     sub.l    address2(pc),d0
  2650.     lsl.l    #2,d0
  2651.     add.l    buffer2(pc),d0
  2652.     move.l    d0,end_point2
  2653. cepb1:
  2654.     movem.l    (sp)+,d0-d1
  2655.     rts
  2656. calc_es_adpcm_b:        *start_point,end_pintの計算
  2657.     movem.l    d0-d1,-(sp)
  2658.     move.l    start_point2(pc),d0
  2659.     beq    ceab1
  2660.     move.l    buffer2(pc),d1
  2661.     beq    ceab1
  2662.     sub.l    d1,d0
  2663.     lsr.l    #2,d0
  2664.     move.l    address2(pc),d1
  2665.     beq    ceab1
  2666.     add.l    d1,d0
  2667.     move.l    d0,start_point2
  2668.  
  2669.     move.l    end_point2(pc),d0
  2670.     sub.l    buffer2(pc),d0
  2671.     lsr.l    #2,d0
  2672.     add.l    address2(pc),d0
  2673.     move.l    d0,end_point2
  2674. ceab1:
  2675.     movem.l    (sp)+,d0-d1
  2676.     rts
  2677.  
  2678. _chg_rate:                *サンプリングレートの設定
  2679.     moveq.l    #0,d7
  2680.     moveq.l    #0,d0
  2681.     move.b    sampling_rate(pc),d0
  2682.     addq.b    #1,d0
  2683.     cmpi.b    #5,d0
  2684.     bne    ok_rate
  2685.     moveq.l    #0,d0
  2686. ok_rate:
  2687.     move.b    d0,-(sp)
  2688.     lsl.w    d0
  2689.     lea    rate_tbl(pc),a0
  2690.     move.w    (a0,d0.w),d0        *freq
  2691.     move.l    rec_data_size(pc),d1
  2692.     add.l    d1,d1            *d1=d1*2(sz=sz*2)
  2693.     divu    d0,d1            *d1=time
  2694.     bne    disp_st
  2695.     moveq.l    #1,d1            *1秒以下は皆1秒とする
  2696. disp_st:
  2697.     move.b    d1,d0
  2698.     andi.l    #$ff,d0
  2699.     bsr    rec_time
  2700.     move.b    (sp)+,d0
  2701.     move.b    d0,last_param        *ワークはXAPNEL部と共用
  2702.     bsr    smp_rate
  2703.     bsr    set_pan_frq
  2704.     bra    complete
  2705.  
  2706. input_smpt:                *input smapling time
  2707.     bsr    del_point
  2708.     bsr    clr_bottom
  2709.     display2    smp_tm,%1111,0,28,13
  2710.     IOCS    _OS_CURON
  2711.     display2    input_smpt_mes,%0111,0,29,41
  2712. i_t_again:
  2713.     moveq.l    #0,d1
  2714.     moveq.l    #30,d2
  2715.     IOCS    _B_LOCATE
  2716.     IOCS    _B_CLR_ST
  2717.     display2    sec,%0111,5,30,6
  2718.     moveq.l    #0,d1
  2719.     moveq.l    #30,d2
  2720.     IOCS    _B_LOCATE
  2721.     lea    input_buffer(pc),a1
  2722.     move.b    #4,(a1)
  2723.     pea    (a1)
  2724.     DOS    _GETS            *一行入力
  2725.     addq.w    #4,sp
  2726.     addq.w    #2,a1
  2727.     bsr    get_num            *d1=秒数
  2728.     tst.l    d1
  2729.     beq    cansel__
  2730.     bmi    cansel__
  2731.     moveq.l    #0,d0
  2732.     move.b    sampling_rate(pc),d0
  2733.     lsl.w    d0
  2734.     lea    rate_tbl(pc),a0
  2735.     move.w    (a0,d0.w),d0
  2736.     mulu    d1,d0
  2737.     lsr.l    d0            *d0=必要バイト数
  2738.     cmpi.l    #max_size,d0
  2739.     bhi    i_t_again
  2740.     move.l    d0,rec_data_size
  2741.     move.w    d1,recording_time
  2742. cansel__:
  2743.     IOCS    _OS_CUROF
  2744.     bsr    scr_init
  2745.     bra    complete
  2746.  
  2747. input_smsz:                *input smapling data size
  2748.     bsr    del_point
  2749.     bsr    clr_bottom
  2750.     display2    smp_sz,%1111,0,28,13
  2751.     IOCS    _OS_CURON
  2752.     display2    input_smsz_mes,%0111,0,29,42
  2753. i_t_again_sz:
  2754.     moveq.l    #0,d1
  2755.     moveq.l    #30,d2
  2756.     IOCS    _B_LOCATE
  2757.     IOCS    _B_CLR_ST
  2758.     display2    bytes,%0111,9,30,10
  2759.     moveq.l    #0,d1
  2760.     moveq.l    #30,d2
  2761.     IOCS    _B_LOCATE
  2762.     lea    input_buffer(pc),a1
  2763.     move.b    #8,(a1)
  2764.     pea    (a1)
  2765.     DOS    _GETS            *一行入力
  2766.     addq.w    #4,sp
  2767.     addq.w    #2,a1            *chr data buffer
  2768.     bsr    get_num            *d1=秒数
  2769.     tst.l    d1
  2770.     beq    cansel_
  2771.     bmi    cansel_
  2772.     cmpi.l    #max_size,d1
  2773.     bhi    i_t_again_sz
  2774.     moveq.l    #0,d0
  2775.     move.b    sampling_rate(pc),d0
  2776.     lsl.w    d0
  2777.     lea    rate_tbl(pc),a0
  2778.     move.w    (a0,d0.w),d0    *freq
  2779.     move.l    d1,d2
  2780.     add.l    d2,d2            *d2=d2*2(sz=sz*2)
  2781.     divu    d0,d2            *d2=time
  2782.     bne    set_dt_wk
  2783.     moveq.l    #1,d2            *1秒以下は皆1秒とする
  2784. set_dt_wk:
  2785.     move.l    d1,rec_data_size
  2786.     move.w    d2,recording_time
  2787. cansel_:
  2788.     IOCS    _OS_CUROF
  2789.     bsr    scr_init
  2790.     bra    complete
  2791.  
  2792. get_num:                *キャラクターコードから数値へ
  2793.     * < (a1)=chr
  2794.     * > d1=number
  2795.     * > (a1)=next chr
  2796.     *
  2797.     cmpi.b    #'+',(a1)
  2798.     sne    pl_mi
  2799.     beq    skip_sgn
  2800.     cmpi.b    #'-',(a1)
  2801.     seq    pl_mi        *'-'ならマーク
  2802.     bne    get_num0
  2803. skip_sgn:
  2804.     addq.w    #1,a1
  2805. get_num0:
  2806.     moveq.l    #0,d1
  2807.     moveq.l    #0,d0
  2808. num_lp01:
  2809.     move.b    (a1)+,d0
  2810.     sub.b    #$30,d0
  2811.     bmi    num_exit
  2812.     cmp.b    #9,d0
  2813.     bhi    num_exit
  2814.  
  2815.     add.l    d1,d1
  2816.     move.l    d1,-(sp)
  2817.     lsl.l    #2,d1
  2818.     add.l    (sp)+,d1    *d1=d1*10
  2819.     add.l    d0,d1        *d1=d1+d0
  2820.     bra    num_lp01
  2821. num_exit:
  2822.     tst.b    pl_mi
  2823.     beq    num_exit_
  2824.     neg.l    d1
  2825. num_exit_:
  2826.     rts
  2827.  
  2828. adjust_frq:            *周波数の微調整
  2829.     movem.l    d0-d7/a0-a6,reg_buff2
  2830.     move.b    data_a(pc),d0
  2831.     or.b    data_b(pc),d0
  2832.     beq    ext_ajfr
  2833.  
  2834.     bsr    clr_bottom
  2835.     display2    adj_frq,%1111,0,28,16
  2836.     display2    adj_mes1,%0111,0,29,31
  2837.     display2    Hz,%0111,6,30,4
  2838.     moveq.l    #0,d1
  2839.     moveq.l    #30,d2
  2840.     IOCS    _B_LOCATE
  2841.     IOCS    _OS_CURON
  2842.  
  2843.     lea    input_buffer(pc),a1
  2844.     move.b    #5,(a1)        *入力文字数
  2845.     pea    (a1)
  2846.     DOS    _GETS        *一行入力
  2847.     addq.w    #4,sp
  2848.  
  2849.     addq.w    #2,a1
  2850.     IOCS    _OS_CUROF
  2851.  
  2852.     cmpi.b    #$20,(a1)
  2853.     bls    ext_ajfr    *スペースよりも小さい時はキャンセル
  2854.  
  2855.     bsr    get_num
  2856.     move.l    d1,d6        *d6=ソース周波数
  2857.     beq    ext_ajfr
  2858.     bmi    ext_ajfr    *数が0やマイナスならキャンセル
  2859.     cmpi.l    #65535,d6
  2860.     bhi    ext_ajfr
  2861.  
  2862.     bsr    clr_bottom
  2863.     display2    adj_frq,%1111,0,28,16
  2864.     display2    input_buffer+2,%0011,17,28,5
  2865.     display2    yajirushi,%0111,22,28,7
  2866.     display2    adj_mes2,%0111,0,29,36
  2867.     display2    Hz,%0111,6,30,4
  2868.     moveq.l    #0,d1
  2869.     moveq.l    #30,d2
  2870.     IOCS    _B_LOCATE
  2871.     IOCS    _OS_CURON
  2872.  
  2873.     lea    input_buffer(pc),a1
  2874.     move.b    #5,(a1)        *入力文字数
  2875.     pea    (a1)
  2876.     DOS    _GETS        *一行入力
  2877.     addq.w    #4,sp
  2878.  
  2879.     addq.w    #2,a1
  2880.     IOCS    _OS_CUROF
  2881.  
  2882.     cmpi.b    #$20,(a1)
  2883.     bls    ext_ajfr    *スペースよりも小さい時はキャンセル
  2884.  
  2885.     bsr    get_num
  2886.     move.l    d1,d7
  2887.     beq    ext_ajfr
  2888.     bmi    ext_ajfr    *数が0やマイナスならキャンセル
  2889.     cmpi.l    #65535,d7
  2890.     bhi    ext_ajfr
  2891.     cmp.l    d6,d7
  2892.     beq    ext_ajfr    *変換が無意味
  2893.  
  2894.     display2    input_buffer+2,%0011,28,28,5
  2895.     display2    Hz,%0111,33,28,4
  2896.     moveq.l    #0,d1
  2897.     moveq.l    #29,d2
  2898.     IOCS    _B_LOCATE
  2899.     IOCS    _B_CLR_ST
  2900.  
  2901.     bsr    get_pt1
  2902.     display2    cv_mes,%1110,41,15,14
  2903.                 *実際に作業を行う…
  2904.     lea    address1(pc),a0
  2905.     tst.b    bank_sel
  2906.     beq    ajfr1
  2907.  
  2908.     tst.b    data_b        *bank_bの下準備
  2909.     beq    ext_ajfr
  2910.     lea    20(a0),a0        *bank_b base addr.
  2911.     tst.l    pbuffer(a0)
  2912.     bne    ajfr0
  2913.     bsr    make_pcm_b
  2914.     bmi    ext_ajfr
  2915. ajfr0:
  2916.     tst.b    data_type
  2917.     beq    ajfr2
  2918.     bsr    calc_es_pcm_b
  2919.     bra    ajfr2
  2920. ajfr1:                *bank_aの下準備
  2921.     tst.b    data_a
  2922.     beq    ext_ajfr
  2923.     tst.l    pbuffer(a0)
  2924.     bne    ajfr11
  2925.     bsr    make_pcm_a
  2926.     bmi    ext_ajfr
  2927. ajfr11:
  2928.     tst.b    data_type
  2929.     beq    ajfr2
  2930.     bsr    calc_es_pcm_a
  2931. ajfr2:
  2932.     movea.l    pstart(a0),a2    *a2=pcm start addr.
  2933.     move.l    pend(a0),d4
  2934.     sub.l    a2,d4
  2935.     addq.l    #2,d4
  2936.     lsr.l    d4        *d4=number of data
  2937.                 *テンポラリエリア確保
  2938.     move.l    #-1,-(sp)
  2939.     DOS    _MALLOC
  2940.     addq.w    #4,sp
  2941.     andi.l    #$00ffffff,d0
  2942.     move.l    d0,d5
  2943.     move.l    d0,-(sp)    *取れる限り確保
  2944.     DOS    _MALLOC
  2945.     addq.w    #4,sp
  2946.     move.l    d0,mm_error
  2947.     bsr    print_em
  2948.     bmi    ext_ajfr
  2949.     move.l    d0,a1        *destination
  2950.     move.l    d0,work1
  2951.     add.l    a1,d5
  2952.     bsr    do_ajfr
  2953.     bsr    print_em
  2954.     bmi    ext_ajfr
  2955.     bra    pchg_endope
  2956.  
  2957. do_ajfr:
  2958.     * < d4.l=data count
  2959.     * < d5.l=mem.block end address
  2960.     * < d6.w=source frq
  2961.     * < d7.w=destination frq
  2962.     * < a1.l=destination pcm data address
  2963.     * < a2.l=source pcm data address
  2964.     * > a1.l=destination pcm data size
  2965.     clr.l    mm_error    *error init
  2966.     exg.l    d6,d7
  2967.     divu    d6,d7
  2968.     move.w    d7,d1        *d1=step
  2969.     clr.w    d7
  2970.     divu    d6,d7
  2971.     swap    d7
  2972.     tst.w    d7
  2973.     beq    @f
  2974.     add.l    #$0001_0000,d7
  2975.     clr.w    d7
  2976. @@:
  2977.     swap    d7        *d7=revise
  2978.     moveq.l    #0,d3
  2979.     tst.w    d1
  2980.     bne    nz_d1
  2981. doa_lp00:
  2982.     move.w    (a2)+,d0
  2983.     add.w    d7,d3
  2984.     bcc    @f
  2985.     move.w    d0,(a1)+
  2986.     cmp.l    a1,d5
  2987.     bhi    @f
  2988.     st.b    mm_error
  2989.     bra    exit_doa_lp01
  2990. @@:
  2991.     subq.l    #1,d4
  2992.     bne    doa_lp00
  2993.     bra    exit_doa
  2994. nz_d1:
  2995.     move.w    d1,d6
  2996.     move.w    (a2)+,d0
  2997.     move.w    (a2),d2
  2998.     cmp.l    pend(a0),a2
  2999.     bls    @f
  3000.     move.w    d0,d2
  3001. @@:
  3002.     add.w    d7,d3
  3003.     bcc    @f
  3004.     addq.w    #1,d6
  3005. @@:
  3006.     ext.l    d0
  3007.     ext.l    d2
  3008.     movem.l    d1/d3,-(sp)
  3009.     sub.l    d0,d2
  3010.     divs    d6,d2
  3011.     move.w    d2,d1        *d1=step
  3012.     clr.w    d2
  3013.     divu    d6,d2
  3014.     swap    d2
  3015.     tst.w    d2
  3016.     beq    @f
  3017.     add.l    #$0001_0000,d2
  3018.     clr.w    d2
  3019. @@:
  3020.     swap    d2        *d2=revise
  3021.     moveq.l    #0,d3
  3022. doa_lp01:
  3023.     move.w    d0,(a1)+
  3024.     cmp.l    a1,d5
  3025.     bhi    @f
  3026.     st.b    mm_error
  3027.     bra    exit_doa_lp01
  3028. @@:
  3029.     add.w    d1,d0
  3030.     add.w    d2,d3
  3031.     bcc    @f
  3032.     tst.w    d1
  3033.     bpl    doa_pls
  3034.     subq.w    #1,d0
  3035.     bra    @f
  3036. doa_pls:
  3037.     addq.w    #1,d0
  3038. @@:
  3039.     subq.w    #1,d6
  3040.     bne    doa_lp01
  3041. exit_doa_lp01:
  3042.     movem.l    (sp)+,d1/d3
  3043.     tst.l    mm_error
  3044.     bmi    exit_doa_
  3045.     subq.l    #1,d4
  3046.     bne    nz_d1
  3047. exit_doa:
  3048.     sub.l    work1(pc),a1
  3049. exit_doa_:
  3050.     rts
  3051.  
  3052. portament:            *ポルタメント
  3053.     movem.l    d0-d7/a0-a6,reg_buff2
  3054.     move.b    data_a(pc),d0
  3055.     or.b    data_b(pc),d0
  3056.     beq    ext_bend
  3057.  
  3058.     bsr    clr_bottom
  3059.     display2    bnd_frq,%1111,0,28,16
  3060.     display2    adj_mes1,%0111,0,29,31
  3061.     display2    Hz,%0111,6,30,4
  3062.     moveq.l    #0,d1
  3063.     moveq.l    #30,d2
  3064.     IOCS    _B_LOCATE
  3065.     IOCS    _OS_CURON
  3066.  
  3067.     lea    input_buffer(pc),a1
  3068.     move.b    #5,(a1)        *入力文字数
  3069.     pea    (a1)
  3070.     DOS    _GETS        *一行入力
  3071.     addq.w    #4,sp
  3072.  
  3073.     addq.w    #2,a1
  3074.     IOCS    _OS_CUROF
  3075.  
  3076.     cmpi.b    #$20,(a1)
  3077.     bls    ext_bend    *スペースよりも小さい時はキャンセル
  3078.  
  3079.     bsr    get_num
  3080.     move.l    d1,d6        *d6=ソース周波数
  3081.     beq    ext_bend
  3082.     bmi    ext_bend    *数が0やマイナスならキャンセル
  3083.     cmpi.l    #65535,d6
  3084.     bhi    ext_bend
  3085.  
  3086.     bsr    clr_bottom
  3087.     display2    bnd_frq,%1111,0,28,16
  3088.     display2    input_buffer+2,%0011,17,28,5
  3089.     display2    yajirushi,%0111,22,28,7
  3090.     display2    adj_mes2,%0111,0,29,36
  3091.     display2    Hz,%0111,6,30,4
  3092.     moveq.l    #0,d1
  3093.     moveq.l    #30,d2
  3094.     IOCS    _B_LOCATE
  3095.     IOCS    _OS_CURON
  3096.  
  3097.     lea    input_buffer(pc),a1
  3098.     move.b    #5,(a1)        *入力文字数
  3099.     pea    (a1)
  3100.     DOS    _GETS        *一行入力
  3101.     addq.w    #4,sp
  3102.  
  3103.     addq.w    #2,a1
  3104.     IOCS    _OS_CUROF
  3105.  
  3106.     cmpi.b    #$20,(a1)
  3107.     bls    ext_bend    *スペースよりも小さい時はキャンセル
  3108.  
  3109.     bsr    get_num
  3110.     move.l    d1,d7
  3111.     beq    ext_bend
  3112.     bmi    ext_bend    *数が0やマイナスならキャンセル
  3113.     cmpi.l    #65535,d7
  3114.     bhi    ext_bend
  3115.     cmp.l    d6,d7
  3116.     beq    ext_bend    *変換が無意味
  3117.  
  3118.     display2    input_buffer+2,%0011,28,28,5
  3119.     display2    Hz,%0111,33,28,4
  3120.     moveq.l    #0,d1
  3121.     moveq.l    #29,d2
  3122.     IOCS    _B_LOCATE
  3123.     IOCS    _B_CLR_ST
  3124.  
  3125.     bsr    get_pt1
  3126.     display2    cv_mes,%1110,41,15,14
  3127.                 *実際に作業を行う…
  3128.     lea    address1(pc),a0
  3129.     tst.b    bank_sel
  3130.     beq    bend1
  3131.  
  3132.     tst.b    data_b        *bank_bの下準備
  3133.     beq    ext_bend
  3134.     lea    20(a0),a0        *bank_b base addr.
  3135.     tst.l    pbuffer(a0)
  3136.     bne    bend0
  3137.     bsr    make_pcm_b
  3138.     bmi    ext_bend
  3139. bend0:
  3140.     tst.b    data_type
  3141.     beq    bend2
  3142.     bsr    calc_es_pcm_b
  3143.     bra    bend2
  3144. bend1:                *bank_aの下準備
  3145.     tst.b    data_a
  3146.     beq    ext_bend
  3147.     tst.l    pbuffer(a0)
  3148.     bne    bend11
  3149.     bsr    make_pcm_a
  3150.     bmi    ext_bend
  3151. bend11:
  3152.     tst.b    data_type
  3153.     beq    bend2
  3154.     bsr    calc_es_pcm_a
  3155. bend2:
  3156.     movea.l    pstart(a0),a2    *a2=pcm start addr.
  3157.     move.l    pend(a0),d4
  3158.     sub.l    a2,d4
  3159.     addq.l    #2,d4
  3160.     lsr.l    d4        *d4=number of data
  3161.                 *テンポラリエリア確保
  3162.     move.l    #-1,-(sp)
  3163.     DOS    _MALLOC
  3164.     addq.w    #4,sp
  3165.     andi.l    #$00ffffff,d0
  3166.     move.l    d0,d5
  3167.     move.l    d0,-(sp)    *取れる限り確保
  3168.     DOS    _MALLOC
  3169.     addq.w    #4,sp
  3170.     move.l    d0,mm_error
  3171.     bsr    print_em
  3172.     bmi    ext_bend
  3173.     move.l    d0,a1        *destination
  3174.     move.l    d0,work1
  3175.     add.l    a1,d5
  3176.     bsr    do_autobend
  3177.     bsr    print_em
  3178.     bmi    ext_bend
  3179.     bra    pchg_endope
  3180.  
  3181. do_autobend:
  3182.     * < d4.l=data count
  3183.     * < d5.l=mem.block end address
  3184.     * < d6.w=source frq
  3185.     * < d7.w=destination frq
  3186.     * < a1.l=destination pcm data address
  3187.     * < a2.l=source pcm data address
  3188.     * > a1.l=destination pcm data size
  3189.     * X d0-d7
  3190.     clr.l    mm_error    *error init
  3191.     exg.l    d6,d7
  3192.     move.l    d6,atb_frqsrc
  3193.     move.l    d6,atb_frqnow
  3194.                 *周波数変化率計算
  3195.     move.l    d4,d1
  3196.     move.l    d7,d0
  3197.     sub.l    d6,d0
  3198.     bpl    @f
  3199.     neg.l    d0
  3200.     bsr    wari2        *d0.l/d1.l=d0.l...d1.l
  3201.     neg.l    d0
  3202.     move.l    d0,atb_step        *周波数変化率
  3203.     move.l    #-1,atb_sgn
  3204.     bra    atb0
  3205. @@:
  3206.     bsr    wari2        *d0.l/d1.l=d0.l...d1.l
  3207.     move.l    d0,atb_step        *周波数変化率
  3208.     move.l    #1,atb_sgn
  3209. atb0:
  3210.     swap    d1
  3211.     clr.w    d1
  3212.     move.l    d1,d0
  3213.     move.l    d4,d1
  3214.     bsr    wari2        *d0.l/d1.l=d0.l...d1.l
  3215.     tst.l    d1
  3216.     beq    @f
  3217.     addq.l    #1,d0        *revise
  3218. @@:
  3219.     move.w    d0,atb_rvs
  3220.  
  3221.     bsr    calc_frqchgrate
  3222.  
  3223.     moveq.l    #0,d3
  3224.     move.w    d3,atb_rvswk
  3225.  
  3226.     tst.b    atb_sgn
  3227.     bpl    nz_d1_b
  3228. doa_lp00_b:
  3229.     move.w    (a2)+,d0
  3230.     add.w    d7,d3
  3231.     bcc    @f
  3232.     move.w    d0,(a1)+
  3233.     cmp.l    a1,d5
  3234.     bhi    @f
  3235.     st.b    mm_error
  3236.     bra    exit_doa_lp01_b
  3237. @@:
  3238.     bsr    calc_frqchgrate
  3239.     subq.l    #1,d4
  3240.     bne    doa_lp00_b
  3241.     bra    exit_doa_b
  3242. nz_d1_b:
  3243.     move.w    d1,d6
  3244.     move.w    (a2)+,d0
  3245.     move.w    (a2),d2
  3246.     cmpi.l    #1,d4        *最後かどうか
  3247.     bne    @f
  3248.     move.w    d0,d2
  3249. @@:
  3250.     add.w    d7,d3
  3251.     bcc    @f
  3252.     addq.w    #1,d6
  3253. @@:
  3254.     ext.l    d0
  3255.     ext.l    d2
  3256.     movem.l    d1/d3,-(sp)
  3257.     sub.l    d0,d2
  3258.     divs    d6,d2
  3259.     move.w    d2,d1        *d1=step
  3260.     clr.w    d2
  3261.     divu    d6,d2
  3262.     swap    d2
  3263.     tst.w    d2
  3264.     beq    @f
  3265.     add.l    #$0001_0000,d2
  3266.     clr.w    d2
  3267. @@:
  3268.     swap    d2        *d2=revise
  3269.     moveq.l    #0,d3
  3270. doa_lp01_b:
  3271.     move.w    d0,(a1)+
  3272.     cmp.l    a1,d5
  3273.     bhi    @f
  3274.     st.b    mm_error
  3275.     bra    exit_doa_lp01_b
  3276. @@:
  3277.     add.w    d1,d0
  3278.     add.w    d2,d3
  3279.     bcc    @f
  3280.     tst.w    d1
  3281.     bpl    doa_pls_b
  3282.     subq.w    #1,d0
  3283.     bra    @f
  3284. doa_pls_b:
  3285.     addq.w    #1,d0
  3286. @@:
  3287.     subq.w    #1,d6
  3288.     bne    doa_lp01_b
  3289. exit_doa_lp01_b:
  3290.     movem.l    (sp)+,d1/d3
  3291.     tst.l    mm_error
  3292.     bmi    exit_doa_b_
  3293.     bsr    calc_frqchgrate
  3294.     subq.l    #1,d4
  3295.     bne    nz_d1_b
  3296. exit_doa_b:
  3297.     sub.l    work1(pc),a1
  3298. exit_doa_b_:
  3299.     rts
  3300.  
  3301. calc_frqchgrate:            *変換パラメータの計算
  3302.     movem.l    atb_frqsrc(pc),d6-d7
  3303.     add.l    atb_step(pc),d7
  3304.     move.w    atb_rvs(pc),d1
  3305.     add.w    d1,atb_rvswk
  3306.     bcc    @f
  3307.     add.l    atb_sgn(pc),d7
  3308. @@:
  3309.     move.l    d7,atb_frqnow
  3310.  
  3311.     divu    d6,d7
  3312.     move.w    d7,d1        *d1=step
  3313.     clr.w    d7
  3314.     divu    d6,d7
  3315.     swap    d7
  3316.     tst.w    d7
  3317.     beq    @f
  3318.     add.l    #$0001_0000,d7
  3319.     clr.w    d7
  3320. @@:
  3321.     swap    d7        *d7=revise
  3322.     rts
  3323.  
  3324. level_chg:            *ボリュームの変更
  3325.     movem.l    d0-d7/a0-a6,reg_buff2
  3326.     move.b    data_a(pc),d0
  3327.     or.b    data_b(pc),d0
  3328.     beq    ext_lvch
  3329.  
  3330.     bsr    clr_bottom
  3331.     display2    lvch_mes,%1111,0,28,13
  3332.     display2    lvch_mes2,%0111,0,29,58
  3333.     display2    _pcnt,%0111,3,30,1
  3334.     moveq.l    #0,d1
  3335.     moveq.l    #30,d2
  3336.     IOCS    _B_LOCATE
  3337.     IOCS    _OS_CURON
  3338.  
  3339.     lea    input_buffer(pc),a1
  3340.     move.b    #3,(a1)        *入力文字数
  3341.     pea    (a1)
  3342.     DOS    _GETS        *一行入力
  3343.     addq.w    #4,sp
  3344.  
  3345.     addq.w    #2,a1
  3346.     IOCS    _OS_CUROF
  3347.  
  3348.     cmpi.b    #$20,(a1)
  3349.     bls    ext_lvch    *スペースよりも小さい時はキャンセル
  3350.  
  3351.     bsr    get_num
  3352.     tst.l    d1
  3353.     beq    ext_lvch
  3354.     bmi    ext_lvch    *数が0やマイナスならキャンセル
  3355.  
  3356.     move.l    d1,d6        *d6=パーセンテージ
  3357.  
  3358.     bsr    get_pt1
  3359.     display2    cv_mes,%1110,41,15,14
  3360.                 *実際に作業を行う…
  3361.     lea    address1(pc),a0
  3362.     tst.b    bank_sel
  3363.     beq    lvch1
  3364.  
  3365.     tst.b    data_b        *bank_bの下準備
  3366.     beq    ext_lvch
  3367.     lea    20(a0),a0        *bank_b base addr.
  3368.     tst.l    pbuffer(a0)
  3369.     bne    lvch0
  3370.     bsr    make_pcm_b
  3371.     bmi    ext_lvch
  3372. lvch0:
  3373.     tst.b    data_type
  3374.     beq    lvch2
  3375.     bsr    calc_es_pcm_b
  3376.     bra    lvch2
  3377. lvch1:                *bank_aの下準備
  3378.     tst.b    data_a
  3379.     beq    ext_lvch
  3380.     tst.l    pbuffer(a0)
  3381.     bne    lvch11
  3382.     bsr    make_pcm_a
  3383.     bmi    ext_lvch
  3384. lvch11:
  3385.     tst.b    data_type
  3386.     beq    lvch2
  3387.     bsr    calc_es_pcm_a
  3388. lvch2:
  3389.     movea.l    pstart(a0),a1    *a1=pcm start addr.
  3390.     move.l    pend(a0),d0
  3391.     sub.l    a1,d0
  3392.     addq.l    #2,d0
  3393.     lsr.l    d0        *d0=number of data
  3394.  
  3395.     bsr    do_level    *pcm dataを実際に加工
  3396.  
  3397. atoshimatsu:
  3398.     tst.b    bank_sel
  3399.     bne    lvch3
  3400.                 *bank_aの後始末
  3401.     tst.l    address1
  3402.     bne    lvch21        *既にadpcm dataがある
  3403.     bsr    make_adpcm_a    *adpcm dataが無かった
  3404.     bmi    ext_lvch
  3405.     bra    lvch22
  3406. lvch21:
  3407.     movea.l    pbuffer(a0),a1
  3408.     move.l    psize(a0),d0
  3409.     movea.l    paddress(a0),a0
  3410.     bsr    pcm_to_adpcm
  3411. lvch22:
  3412.     bsr    waku1
  3413.     movea.l    buffer1(pc),a6
  3414.     move.l    size1(pc),d6
  3415.     move.w    #scr_wy,genten_y
  3416.     bsr    dsp_wv
  3417.     tst.b    data_type
  3418.     beq    lvch23
  3419.     bsr    calc_es_adpcm_a
  3420. lvch23:
  3421.     bsr    init_hex_area_a
  3422.     bsr    put_pt1
  3423.     bra    ext_lvch
  3424.  
  3425. lvch3:                *bak_bの後始末
  3426.     tst.l    address2
  3427.     bne    lvch31
  3428.     bsr    make_adpcm_b
  3429.     bmi    ext_lvch
  3430.     bra    lvch32
  3431. lvch31:
  3432.     movea.l    pbuffer(a0),a1
  3433.     move.l    psize(a0),d0
  3434.     movea.l    paddress(a0),a0
  3435.     bsr    pcm_to_adpcm
  3436. lvch32:
  3437.     bsr    waku2
  3438.     movea.l    buffer2(pc),a6
  3439.     move.l    size2(pc),d6
  3440.     move.w    #scr_wy+plus_,genten_y
  3441.     bsr    dsp_wv
  3442.     tst.b    data_type
  3443.     beq    lvch33
  3444.     bsr    calc_es_adpcm_b
  3445. lvch33:
  3446.     bsr    init_hex_area_b
  3447.     bsr    put_pt1
  3448. ext_ajfr:
  3449. ext_bend:
  3450. ext_lvch:
  3451. ext_efct:
  3452.     bra    non_ope
  3453.  
  3454. do_level:            *パーセンテージを16進変換
  3455.     * < d0=data count
  3456.     * < a1=pcm data address
  3457.     * < d6=percentage(1%~300%)
  3458.     movem.l    d0/d2/d6/a1,-(sp)
  3459.     lsl.l    #7,d6        *d6=d6*128
  3460.     divu    #100,d6
  3461.     andi.l    #$ffff,d6    *d6=0~200→0~256
  3462. lvch_lp:
  3463.     moveq.l    #0,d2
  3464.     move.w    (a1),d2
  3465.  
  3466.     muls    d6,d2        *d6(0-256)にはパーセントが
  3467.     asr.l    #7,d2        *入っている
  3468. *    bsr    chk_ovf        *over flow check
  3469.  
  3470.     move.w    d2,(a1)+    *store pcm data to buffer
  3471.  
  3472.     subq.l    #1,d0
  3473.     bne    lvch_lp
  3474.     movem.l    (sp)+,d0/d2/d6/a1
  3475.     rts
  3476.  
  3477. pitch_chg:            *ピッチの変更
  3478.     movem.l    d0-d7/a0-a6,reg_buff2
  3479.     move.b    data_a(pc),d0
  3480.     or.b    data_b(pc),d0
  3481.     beq    ext_lvch
  3482.     bsr    clr_bottom
  3483.     display2    ptch_mes,%1111,0,28,13
  3484.     display2    ptch_mes2,%0111,0,29,51
  3485.     display2    _ksft,%0111,3,30,12
  3486.     moveq.l    #0,d1
  3487.     moveq.l    #30,d2
  3488.     IOCS    _B_LOCATE
  3489.     IOCS    _OS_CURON
  3490.  
  3491.     lea    input_buffer(pc),a1
  3492.     move.b    #3,(a1)        *入力文字数
  3493.     pea    (a1)
  3494.     DOS    _GETS        *一行入力
  3495.     addq.w    #4,sp
  3496.  
  3497.     addq.w    #2,a1
  3498.     IOCS    _OS_CUROF
  3499.  
  3500.     cmpi.b    #$20,(a1)
  3501.     bls    ext_ptch    *スペースよりも小さい時はキャンセル
  3502.  
  3503.     bsr    get_num
  3504.     tst.l    d1
  3505.     beq    ext_ptch    *0はキャンセル
  3506.     move.l    d1,d6
  3507.     tst.l    d1
  3508.     bpl    chk_abs
  3509.     neg.l    d1
  3510. chk_abs:
  3511.     cmpi.b    #12,d1
  3512.     bhi    ext_ptch    *±12以上は無効とする
  3513.  
  3514.     bsr    get_pt1
  3515.     bsr    dsp_cv_mes
  3516.                 *実際に作業を行う…
  3517.     lea    address1(pc),a0
  3518.     tst.b    bank_sel
  3519.     beq    ptch1
  3520.  
  3521.     tst.b    data_b        *bank_bの下準備
  3522.     beq    ext_ptch
  3523.     lea    20(a0),a0        *bank_b base addr.
  3524.     tst.l    pbuffer(a0)
  3525.     bne    ptch0
  3526.     bsr    make_pcm_b
  3527.     bmi    ext_ptch
  3528. ptch0:
  3529.     tst.b    data_type
  3530.     beq    ptch2
  3531.     bsr    calc_es_pcm_b
  3532.     bra    ptch2
  3533. ptch1:                *bank_aの下準備
  3534.     tst.b    data_a
  3535.     beq    ext_ptch
  3536.     tst.l    pbuffer(a0)
  3537.     bne    ptch11
  3538.     bsr    make_pcm_a
  3539.     bmi    ext_ptch
  3540. ptch11:
  3541.     tst.b    data_type
  3542.     beq    ptch2
  3543.     bsr    calc_es_pcm_a
  3544. ptch2:
  3545.     movea.l    pstart(a0),a2    *a2=pcm start addr.
  3546.     move.l    pend(a0),d1
  3547.     sub.l    a2,d1
  3548.     addq.l    #2,d1
  3549.  
  3550.     add.l    d1,d1        *取敢えず2倍
  3551.     move.l    d1,-(sp)    *コンバート先のメモリを確保
  3552.     DOS    _MALLOC
  3553.     addq.w    #4,sp
  3554.     move.l    d0,mm_error
  3555.     bsr    print_em
  3556.     bmi    ext_ptch    *case:error
  3557.     movea.l    d0,a1        *a1=destination address
  3558.     move.l    d0,work1
  3559.  
  3560.     lsr.l    #2,d1
  3561.     move.l    d1,d0        *d0=number of data
  3562.  
  3563.     add.w    #12,d6
  3564.     add.w    d6,d6
  3565.     cmpi.b    #$18,d6
  3566.     bcs    _shift_down        *ピッチを下げるケース
  3567. *shift_up                *ピッチを上げるケース
  3568.     cmpi.l    #8,d0        *サイズが小さすぎる
  3569.     bls    ext_ptch
  3570.     lea    frq_tbl,a5
  3571.     move.w    -26(a5,d6.w),d4
  3572.     move.b    #1,d6        *set switch
  3573.     bra    bsr_do_pitch
  3574. _shift_down:
  3575.     lea    frq_tbl2(pc),a5
  3576.     move.w    (a5,d6.w),d4
  3577.     st    d6        *set switch
  3578. bsr_do_pitch:
  3579.     bsr    do_pitch    *実際にデータを加工(out:a1=dest data size)
  3580. pchg_endope:
  3581.     * < a1.l=destination pcm data size
  3582.     move.l    a1,d3        *d3=size too
  3583.  
  3584.     move.l    d3,-(sp)        *new len
  3585.     move.l    work1(pc),-(sp)        *memptr
  3586.     DOS    _SETBLOCK        *pcm bufferの縮小
  3587.     addq.w    #8,sp
  3588.  
  3589.     move.l    psize(a0),d4
  3590.     lsl.l    #2,d4
  3591.     add.l    pbuffer(a0),d4    *d4=end addr.
  3592.     sub.l    pend(a0),d4
  3593.     subq.l    #2,d4        *use later
  3594.     move.l    d4,d5        *d4=d5=rear pcm data size
  3595.  
  3596.     move.l    pstart(a0),d1
  3597.     sub.l    pbuffer(a0),d1    *d1=front pcm size
  3598.  
  3599.     add.l    d3,d5
  3600.     add.l    d1,d5        *d5=new pcm data size
  3601.     move.l    d5,-(sp)
  3602.     DOS    _MALLOC
  3603.     addq.w    #4,sp
  3604.     move.l    d0,mm_error
  3605.     bsr    print_em
  3606.     bmi    ext_ptch_    *case:error
  3607.     move.l    d0,work2
  3608.  
  3609.     movea.l    d0,a2        *dest. addr
  3610.     move.l    d1,d2        *d2=trans. size
  3611.     moveq.l    #%0000_0101,d1
  3612.     movea.l    pbuffer(a0),a1    *source
  3613.     bsr    trans_dma    *先頭部の転送
  3614.  
  3615.     adda.l    d2,a2        *dest. addr
  3616.     move.l    work1(pc),a1    *source
  3617.     move.l    d3,d2        *size
  3618.     bsr    trans_dma    *コンバートして出来たデータの転送
  3619.     move.l    a2,pstart(a0)    *new start point
  3620.  
  3621.     adda.l    d2,a2        *dest. addr.
  3622.     move.l    pend(a0),a1    *source
  3623.     addq.w    #2,a1
  3624.     move.l    d4,d2        *size
  3625.     bsr    trans_dma    *後部の転送
  3626.     subq.w    #2,a2
  3627.     move.l    a2,pend(a0)    *new end point
  3628.  
  3629.     move.l    work1(pc),-(sp)        *ワーク開放
  3630.     DOS    _MFREE
  3631.     addq.w    #4,sp
  3632.  
  3633.     move.l    pbuffer(a0),-(sp)    *pcm buffer開放
  3634.     DOS    _MFREE
  3635.     addq.w    #4,sp
  3636.  
  3637.     move.l    paddress(a0),d0
  3638.     beq    reduce_mem
  3639.     move.l    d0,-(sp)        *adpcm buffer開放
  3640.     DOS    _MFREE
  3641.     addq.w    #4,sp
  3642. reduce_mem:
  3643. *    move.l    d3,-(sp)        *new len
  3644. *    move.l    work2(pc),-(sp)        *memptr
  3645. *    DOS    _SETBLOCK        *pcm bufferの縮小
  3646. *    addq.w    #8,sp
  3647.  
  3648.     lsr.l    #2,d5
  3649.     move.l    d5,psize(a0)        *new adpcm size
  3650.     move.l    work2,pbuffer(a0)    *new pcm addr.
  3651.  
  3652.                 *adpcmに戻す作業
  3653.     tst.b    bank_sel
  3654.     bne    ptch3
  3655.                 *bank_aの後始末
  3656.     bsr    make_adpcm_a    *adpcm dataが無かった
  3657.     bmi    ext_ptch
  3658.     bsr    waku1
  3659.     movea.l    buffer1(pc),a6
  3660.     move.l    size1(pc),d6
  3661.     move.w    #scr_wy,genten_y
  3662.     bsr    dsp_wv
  3663.     tst.b    data_type
  3664.     beq    ptch23
  3665.     bsr    calc_es_adpcm_a
  3666. ptch23:
  3667.     bsr    init_hex_area_a
  3668.     bsr    put_pt1
  3669.     bra    ext_ptch
  3670.  
  3671. ptch3:                *bak_bの後始末
  3672.     bsr    make_adpcm_b
  3673.     bmi    ext_ptch
  3674.     bsr    waku2
  3675.     movea.l    buffer2(pc),a6
  3676.     move.l    size2(pc),d6
  3677.     move.w    #scr_wy+plus_,genten_y
  3678.     bsr    dsp_wv
  3679.     tst.b    data_type
  3680.     beq    ptch33
  3681.     bsr    calc_es_adpcm_b
  3682. ptch33:
  3683.     bsr    init_hex_area_b
  3684.     bsr    put_pt1
  3685. ext_ptch:
  3686.     bra    non_ope
  3687. ext_ptch_:
  3688.     move.l    work1(pc),d0
  3689.     beq    ext_ptch
  3690.     move.l    d0,-(sp)
  3691.     DOS    _MFREE
  3692.     addq.w    #4,sp
  3693.     bra    non_ope
  3694.  
  3695. do_pitch:
  3696.     * < a2=source addr.
  3697.     * < a1=destination addr.
  3698.     * < d0=number of source data
  3699.     * < d4=shift parameter
  3700.      * < d6=direction of pitch shift(-:shift down +:shift up)
  3701.     * > a1=destination size
  3702.     * - ALL
  3703.     movem.l    d0-d7/a0/a2-a6,-(sp)
  3704.     moveq.l    #0,d7
  3705.     moveq.l    #0,d3
  3706.     moveq.l    #0,d5
  3707.  
  3708.     pea    (a1)        *keep start address
  3709. cvt_lp:
  3710.     move.w    (a2)+,d2
  3711.  
  3712.     tst.b    d5    *初めて
  3713.     bne    _up_or_down
  3714.     seq.b    d5
  3715.     bra    _wrt_dst_pcm_dt
  3716. _up_or_down:
  3717.     tst.b    d6
  3718.     bmi    _do_shift_down
  3719.  
  3720.     move.w    d4,d1
  3721.     add.w    d1,d3
  3722.     bcc    _check_dsz
  3723.     bra    _wrt_dst_pcm_dt
  3724. _do_shift_down:
  3725.     move.w    d4,d1
  3726.     beq    @f
  3727.     add.w    d1,d3
  3728.     bcc    _wrt_dst_pcm_dt
  3729. @@:
  3730.     move.w    d2,d1
  3731.     add.w    d7,d1
  3732.     asr.w    d1        *線形補間
  3733.     move.w    d1,(a1)+    *store additional pcm data
  3734. _wrt_dst_pcm_dt:
  3735.     move.w    d2,(a1)+    *store pcm data to buffer
  3736. _check_dsz:
  3737.     move.w    d2,d7
  3738.     subq.l    #1,d0
  3739.     bne    cvt_lp
  3740.     suba.l    (sp)+,a1    *a1=size
  3741.     movem.l    (sp)+,d0-d7/a0/a2-a6
  3742.     rts
  3743.  
  3744. mixing:                *2つのデータをミックスする
  3745.     movem.l    d0-d7/a0-a6,reg_buff2
  3746.     clr.b    work2        *init work2
  3747.     clr.b    mix_mode    *set mix mode
  3748.     move.b    data_a(pc),d0
  3749.     and.b    data_b(pc),d0
  3750.     beq    ext_mix        *データが2つ無いならキャンセル
  3751.  
  3752.     bsr    clr_bottom
  3753.     lea    mix_mes(pc),a0
  3754. dsp_mix_mes:
  3755.     display2_    (a0),%1111,0,28,8
  3756.     display2    mix_mes2,%0111,0,29,22
  3757.     display2    mix_mes3,%0111,0,30,30
  3758.     moveq.l    #22,d1
  3759.     moveq.l    #29,d2
  3760.     IOCS    _B_LOCATE
  3761.     IOCS    _OS_CURON
  3762.     DOS    _INKEY
  3763.     cmpi.b    #'1',d0
  3764.     sne    work1        *memory direction
  3765.     beq    @f
  3766.     cmpi.b    #'2',d0
  3767.     bne    ext_mix
  3768. @@:
  3769.     IOCS    _OS_CUROF
  3770.  
  3771.     bsr    get_pt1
  3772.     display2    cv_mes,%1110,41,15,14
  3773.                 *実際に作業を行う…
  3774.     tst.l    buffer2
  3775.     bne    @f
  3776.     move.b    #2,work2    *mark
  3777.     bsr    make_pcm_b
  3778.     bmi    ext_mix
  3779. @@:
  3780.     tst.b    data_type
  3781.     beq    @f
  3782.     bsr    calc_es_pcm_b
  3783. @@:                *bank_aの下準備
  3784.     tst.l    buffer1
  3785.     bne    @f
  3786.     bsr    make_pcm_a
  3787.     ori.b    #1,work2    *mark
  3788.     bmi    ext_mix
  3789. @@:
  3790.     tst.b    data_type
  3791.     beq    @f
  3792.     bsr    calc_es_pcm_a
  3793. @@:
  3794.     tst.b    work1        *direction?
  3795.     beq    case_atob
  3796. *case_btoa:            *BからAへ
  3797.     move.l    start_point2(pc),a1
  3798.     move.l    end_point2(pc),d1
  3799.     sub.l    a1,d1
  3800.     addq.l    #2,d1
  3801.     lsr.l    #2,d1
  3802.  
  3803.     move.l    buffer1(pc),a2
  3804.     move.l    size1(pc),d2
  3805.  
  3806.     move.l    start_point1(pc),d0
  3807.     sub.l    a2,d0
  3808.     lsr.l    #2,d0
  3809.     move.l    d0,offset
  3810.  
  3811.     bsr    mix_pcm
  3812.  
  3813.     bsr    waku1
  3814.     bsr    mfree_adpcm_a    *出来たデータを転送先へ
  3815.     bsr    mfree_pcm_a
  3816.     move.l    dest_size(pc),size1
  3817.     move.l    buffer3(pc),buffer1
  3818.     clr.l    start_point1
  3819.     clr.l    end_point1
  3820.     bsr    make_adpcm_a
  3821.     bmi    ext_mix
  3822.     move.l    buffer1(pc),a6
  3823.     move.l    size1(pc),d6
  3824.     move.w    #genten_a,genten_y
  3825.     bsr    dsp_wv
  3826.  
  3827.     btst.b    #1,work2(pc)
  3828.     beq    after_mix
  3829.     bsr    waku2
  3830.     move.l    buffer2(pc),a6
  3831.     move.l    size2(pc),d6
  3832.     move.w    #genten_b,genten_y
  3833.     bsr    dsp_wv
  3834.     bra    after_mix
  3835. case_atob:            *AからBへ
  3836.     move.l    start_point1(pc),a1
  3837.     move.l    end_point1(pc),d1
  3838.     sub.l    a1,d1
  3839.     addq.l    #2,d1
  3840.     lsr.l    #2,d1
  3841.  
  3842.     move.l    buffer2(pc),a2
  3843.     move.l    size2(pc),d2
  3844.  
  3845.     move.l    start_point2(pc),d0
  3846.     sub.l    a2,d0
  3847.     lsr.l    #2,d0
  3848.     move.l    d0,offset
  3849.  
  3850.     bsr    mix_pcm
  3851.  
  3852.     bsr    waku2
  3853.     bsr    mfree_adpcm_b    *出来たデータを転送先へ
  3854.     bsr    mfree_pcm_b
  3855.     move.l    dest_size(pc),size2
  3856.     move.l    buffer3(pc),buffer2
  3857.     clr.l    start_point2
  3858.     clr.l    end_point2
  3859.     bsr    make_adpcm_b
  3860.     bmi    ext_mix
  3861.     move.l    buffer2(pc),a6
  3862.     move.l    size2(pc),d6
  3863.     move.w    #genten_b,genten_y
  3864.     bsr    dsp_wv
  3865.  
  3866.     btst.b    #0,work2(pc)
  3867.     beq    after_mix
  3868.     bsr    waku1
  3869.     move.l    buffer1(pc),a6
  3870.     move.l    size1(pc),d6
  3871.     move.w    #genten_a,genten_y
  3872.     bsr    dsp_wv
  3873. after_mix:
  3874.     tst.b    data_type    *後始末
  3875.     beq    @f
  3876.     bsr    calc_es_adpcm_a
  3877.     bsr    calc_es_adpcm_b
  3878. @@:
  3879.     bsr    init_hex_area_a
  3880.     bsr    init_hex_area_b
  3881.     bsr    put_pt1
  3882. ext_mix:
  3883.     bra    non_ope
  3884.  
  3885. logic_ope:            *2つのデータの論理演算を行なう。
  3886.     movem.l    d0-d7/a0-a6,reg_buff2
  3887.     clr.b    work2        *init work2
  3888.  
  3889.     move.b    data_a(pc),d0
  3890.     and.b    data_b(pc),d0
  3891.     beq    ext_minus    *データが2つ無いならキャンセル
  3892.  
  3893.     bsr    clr_bottom
  3894.     lea    minus_mes(pc),a0
  3895.     display2_    (a0),%1111,0,28,20
  3896.     display2    minus_mes1,%0111,0,29,20
  3897.     display2    minus_mes2,%0111,0,30,28
  3898.     moveq.l    #21,d1
  3899.     moveq.l    #29,d2
  3900.     IOCS    _B_LOCATE
  3901.     IOCS    _OS_CURON
  3902.     DOS    _INKEY
  3903.     cmpi.b    #'1',d0
  3904.     bcs    ext_minus
  3905.     cmpi.b    #'5',d0
  3906.     bhi    ext_minus
  3907.     sub.b    #'1',d0
  3908.     move.b    d0,mix_mode
  3909.     andi.w    #$00ff,d0
  3910.     mulu    #31,d0
  3911.     lea    minus_mes3(pc),a2
  3912.     add.l    d0,a2
  3913.     IOCS    _OS_CUROF
  3914.  
  3915.     bsr    clr_bottom
  3916.     display2_    (a0),%1111,0,28,20
  3917.     display2    mix_mes2,%0111,0,29,22
  3918.     display2_    (a2),%0111,0,30,30
  3919.     moveq.l    #22,d1
  3920.     moveq.l    #29,d2
  3921.     IOCS    _B_LOCATE
  3922.     IOCS    _OS_CURON
  3923.     DOS    _INKEY
  3924.     cmpi.b    #'1',d0
  3925.     sne    work1        *memory direction
  3926.     beq    @f
  3927.     cmpi.b    #'2',d0
  3928.     bne    ext_minus
  3929. @@:                *オフセット入力
  3930.     IOCS    _OS_CUROF
  3931.  
  3932.     bsr    get_pt1
  3933.     display2    cv_mes,%1110,41,15,14
  3934.                 *実際に作業を行う…
  3935.     tst.l    buffer2
  3936.     bne    @f
  3937.     move.b    #2,work2    *mark
  3938.     bsr    make_pcm_b
  3939.     bmi    ext_minus
  3940. @@:
  3941.     tst.b    data_type
  3942.     beq    @f
  3943.     bsr    calc_es_pcm_b
  3944. @@:                *bank_aの下準備
  3945.     tst.l    buffer1
  3946.     bne    @f
  3947.     bsr    make_pcm_a
  3948.     ori.b    #1,work2    *mark
  3949.     bmi    ext_minus
  3950. @@:
  3951.     tst.b    data_type
  3952.     beq    @f
  3953.     bsr    calc_es_pcm_a
  3954. @@:
  3955.     tst.b    work1        *direction?
  3956.     beq    case_atob_minus
  3957. *case_btoa:            *BからAへ
  3958.     move.l    start_point2(pc),a1
  3959.     move.l    end_point2(pc),d1
  3960.     sub.l    a1,d1
  3961.     addq.l    #2,d1
  3962.     lsr.l    #2,d1
  3963.  
  3964.     move.l    buffer1(pc),a2
  3965.     move.l    size1(pc),d2
  3966.  
  3967.     move.l    start_point1(pc),d0
  3968.     sub.l    a2,d0
  3969.     lsr.l    #2,d0
  3970.     move.l    d0,offset
  3971.  
  3972.     bsr    logic_pcm
  3973.  
  3974.     bsr    waku1
  3975.     bsr    mfree_adpcm_a    *出来たデータを転送先へ
  3976.     bsr    mfree_pcm_a
  3977.     move.l    dest_size(pc),size1
  3978.     move.l    buffer3(pc),buffer1
  3979.     clr.l    start_point1
  3980.     clr.l    end_point1
  3981.     bsr    make_adpcm_a
  3982.     bmi    ext_minus
  3983.     move.l    buffer1(pc),a6
  3984.     move.l    size1(pc),d6
  3985.     move.w    #genten_a,genten_y
  3986.     bsr    dsp_wv
  3987.  
  3988.     btst.b    #1,work2(pc)
  3989.     beq    after_minus
  3990.     bsr    waku2
  3991.     move.l    buffer2(pc),a6
  3992.     move.l    size2(pc),d6
  3993.     move.w    #genten_b,genten_y
  3994.     bsr    dsp_wv
  3995.     bra    after_minus
  3996. case_atob_minus:            *AからBへ
  3997.     move.l    start_point1(pc),a1
  3998.     move.l    end_point1(pc),d1
  3999.     sub.l    a1,d1
  4000.     addq.l    #2,d1
  4001.     lsr.l    #2,d1
  4002.  
  4003.     move.l    buffer2(pc),a2
  4004.     move.l    size2(pc),d2
  4005.  
  4006.     move.l    start_point2(pc),d0
  4007.     sub.l    a2,d0
  4008.     lsr.l    #2,d0
  4009.     move.l    d0,offset
  4010.  
  4011.     bsr    logic_pcm
  4012.  
  4013.     bsr    waku2
  4014.     bsr    mfree_adpcm_b    *出来たデータを転送先へ
  4015.     bsr    mfree_pcm_b
  4016.     move.l    dest_size(pc),size2
  4017.     move.l    buffer3(pc),buffer2
  4018.     clr.l    start_point2
  4019.     clr.l    end_point2
  4020.     bsr    make_adpcm_b
  4021.     bmi    ext_minus
  4022.     move.l    buffer2(pc),a6
  4023.     move.l    size2(pc),d6
  4024.     move.w    #genten_b,genten_y
  4025.     bsr    dsp_wv
  4026.  
  4027.     btst.b    #0,work2(pc)
  4028.     beq    after_minus
  4029.     bsr    waku1
  4030.     move.l    buffer1(pc),a6
  4031.     move.l    size1(pc),d6
  4032.     move.w    #genten_a,genten_y
  4033.     bsr    dsp_wv
  4034. after_minus:
  4035.     tst.b    data_type    *後始末
  4036.     beq    @f
  4037.     bsr    calc_es_adpcm_a
  4038.     bsr    calc_es_adpcm_b
  4039. @@:
  4040.     bsr    init_hex_area_a
  4041.     bsr    init_hex_area_b
  4042.     bsr    put_pt1
  4043. ext_minus:
  4044.     bra    non_ope
  4045.  
  4046. logic_pcm:            *2つのPCMデータの論理演算を行なう
  4047.     * < d1=size1,d2=size2
  4048.     * < a1=buffer1,a2=buffer2
  4049.     * < offset
  4050.     * > buffer3,dest_size
  4051.     movem.l    d0-d7/a0-a6,-(sp)
  4052.     move.l    d1,d3
  4053.     add.l    offset(pc),d3
  4054.     cmp.l    d2,d3
  4055.     bhi    @f
  4056.     move.l    d2,d3        *d2の方が大きかったら
  4057. @@:
  4058.     move.l    d3,dest_size
  4059.     lsl.l    #2,d3        *4倍のワークエリアが必要
  4060.     move.l    d3,-(sp)
  4061.     DOS     _MALLOC
  4062.     addq.w    #4,sp
  4063.     move.l    d0,mm_error
  4064.     bsr    print_em
  4065.     bmi    ext_do_logic
  4066.     move.l    d0,buffer3
  4067.  
  4068.     movem.l    d1-d2/a1-a2,-(sp)
  4069.     move.l    d3,d2        *size
  4070.     moveq.l    #%00000101,d1    *mode
  4071.     movea.l    a2,a1        *source
  4072.     movea.l    buffer3(pc),a2    *dest
  4073.     bsr    trans_dma
  4074.     movem.l    (sp)+,d1-d2/a1-a2
  4075.  
  4076.     move.l    dest_size(pc),d3
  4077.     sub.l    d2,d3        *お尻の部分をクリア
  4078.     beq    go_logic
  4079.     move.l    buffer3(pc),a0
  4080.     add.l    d2,d2
  4081.     add.l    d2,d2
  4082.     add.l    d2,a0
  4083.     moveq.l    #0,d0
  4084. @@:
  4085.     move.l    d0,(a0)+    *いっぺんに2つクリア
  4086.     subq.l    #1,d3
  4087.     bne    @b
  4088. go_logic:
  4089.     *a1=use parameter
  4090.     movea.l    buffer3(pc),a2
  4091.     move.l    offset(pc),d2
  4092.     add.l    d2,d2
  4093.     add.l    d2,d2
  4094.     adda.l    d2,a2
  4095.     move.l    d1,d0
  4096.     bsr    do_logic
  4097. ext_do_logic:
  4098.     movem.l    (sp)+,d0-d7/a0-a6
  4099.     rts
  4100.  
  4101. do_logic:
  4102.     * < a1=source pcm data
  4103.     * < a2=dest.  pcm data
  4104.     * < d0.l=data size(adpcm range)
  4105.     add.l    d0,d0
  4106.     moveq.l    #0,d1
  4107.     move.b    mix_mode(pc),d1
  4108.     add.w    d1,d1
  4109.     move.w    minus_tbl(pc,d1.w),d1
  4110.     jmp    minus_tbl(pc,d1.w)
  4111. minus_tbl:
  4112.     dc.w    minus_ADD-minus_tbl
  4113.     dc.w    minus_SUB-minus_tbl
  4114.     dc.w    minus_OR-minus_tbl
  4115.     dc.w    minus_AND-minus_tbl
  4116.     dc.w    minus_EOR-minus_tbl
  4117. minus_ADD:
  4118. @@:
  4119.     move.w    (a1)+,d2
  4120.     add.w    (a2),d2
  4121. *    bsr    chk_ovf
  4122.     move.w    d2,(a2)+
  4123.     subq.l    #1,d0
  4124.     bne    @b
  4125.     rts
  4126. minus_SUB:
  4127. @@:
  4128.     move.w    (a1)+,d2
  4129.     sub.w    (a2),d2
  4130. *    bsr    chk_ovf
  4131.     move.w    d2,(a2)+
  4132.     subq.l    #1,d0
  4133.     bne    @b
  4134.     rts
  4135. minus_OR:
  4136. @@:
  4137.     move.w    (a1)+,d2
  4138.     or.w    (a2),d2
  4139. *    bsr    chk_ovf
  4140.     move.w    d2,(a2)+
  4141.     subq.l    #1,d0
  4142.     bne    @b
  4143.     rts
  4144. minus_AND:
  4145. @@:
  4146.     move.w    (a1)+,d2
  4147.     and.w    (a2),d2
  4148. *    bsr    chk_ovf
  4149.     move.w    d2,(a2)+
  4150.     subq.l    #1,d0
  4151.     bne    @b
  4152.     rts
  4153. minus_EOR:
  4154. @@:
  4155.     move.w    (a1)+,d2
  4156.     move.w    (a2),d1
  4157.     eor.w    d1,d2
  4158. *    bsr    chk_ovf
  4159.     move.w    d2,(a2)+
  4160.     subq.l    #1,d0
  4161.     bne    @b
  4162.     rts
  4163.  
  4164. deconvolution_ope:        *2つのデータの逆たたみ込みを行なう
  4165.     movem.l    d0-d7/a0-a6,reg_buff2
  4166.     clr.b    work2        *init work2
  4167.     move.b    data_a(pc),d0
  4168.     and.b    data_b(pc),d0
  4169.     beq    ext_deconvol    *データが2つ無いならキャンセル
  4170.  
  4171.     bsr    clr_bottom
  4172.     lea    deconvol_mes(pc),a0
  4173.     display2_    (a0),%1111,0,28,13
  4174.     display2    mix_mes2,%0111,0,29,22
  4175.     display2    deconvol_mes3,%0111,0,30,26
  4176.     moveq.l    #22,d1
  4177.     moveq.l    #29,d2
  4178.     IOCS    _B_LOCATE
  4179.     IOCS    _OS_CURON
  4180.     DOS    _INKEY
  4181.     cmpi.b    #'1',d0
  4182.     sne    work1        *memory direction
  4183.     beq    @f
  4184.     cmpi.b    #'2',d0
  4185.     bne    ext_deconvol
  4186. @@:            *オフセット入力
  4187.     IOCS    _OS_CUROF
  4188.  
  4189.     bsr    get_pt1
  4190.     display2    cv_mes,%1110,41,15,14
  4191.                 *実際に作業を行う…
  4192.     tst.l    buffer2
  4193.     bne    @f
  4194.     move.b    #2,work2    *mark
  4195.     bsr    make_pcm_b
  4196.     bmi    ext_deconvol
  4197. @@:
  4198.     tst.b    data_type
  4199.     beq    @f
  4200.     bsr    calc_es_pcm_b
  4201. @@:                *bank_aの下準備
  4202.     tst.l    buffer1
  4203.     bne    @f
  4204.     bsr    make_pcm_a
  4205.     ori.b    #1,work2    *mark
  4206.     bmi    ext_deconvol
  4207. @@:
  4208.     tst.b    data_type
  4209.     beq    @f
  4210.     bsr    calc_es_pcm_a
  4211. @@:
  4212.     tst.b    work1        *direction?
  4213.     beq    case_atob_deconvol
  4214. *case_btoa:            *BからAへ
  4215.     move.l    start_point2(pc),a1
  4216.     move.l    end_point2(pc),d1
  4217.     sub.l    a1,d1
  4218.     addq.l    #2,d1
  4219.     lsr.l    #2,d1
  4220.  
  4221.     move.l    buffer1(pc),a2
  4222.     move.l    end_point1(pc),d2
  4223.     sub.l    start_point1(pc),d2
  4224.     addq.l    #2,d2
  4225.     lsr.l    #2,d2
  4226.     move.l    size1(pc),d3
  4227.  
  4228.     move.l    start_point1(pc),d0
  4229.     sub.l    a2,d0
  4230.     lsr.l    #2,d0
  4231.     move.l    d0,offset
  4232.     add.l    d2,d0
  4233.     sub.l    d0,d3
  4234.  
  4235.     bsr    deconvolution_pcm
  4236.  
  4237.     bsr    waku1
  4238.     bsr    mfree_adpcm_a    *出来たデータを転送先へ
  4239.     bsr    mfree_pcm_a
  4240.     move.l    dest_size(pc),size1
  4241.     move.l    buffer3(pc),buffer1
  4242.     clr.l    start_point1
  4243.     clr.l    end_point1
  4244.     bsr    make_adpcm_a
  4245.     bmi    ext_deconvol
  4246.     move.l    buffer1(pc),a6
  4247.     move.l    size1(pc),d6
  4248.     move.w    #genten_a,genten_y
  4249.     bsr    dsp_wv
  4250.  
  4251.     btst.b    #1,work2(pc)
  4252.     beq    after_deconvol
  4253.     bsr    waku2
  4254.     move.l    buffer2(pc),a6
  4255.     move.l    size2(pc),d6
  4256.     move.w    #genten_b,genten_y
  4257.     bsr    dsp_wv
  4258.     bra    after_deconvol
  4259. case_atob_deconvol:            *AからBへ
  4260.     move.l    start_point1(pc),a1
  4261.     move.l    end_point1(pc),d1
  4262.     sub.l    a1,d1
  4263.     addq.l    #2,d1
  4264.     lsr.l    #2,d1
  4265.  
  4266.     move.l    buffer2(pc),a2
  4267.     move.l    end_point2(pc),d2
  4268.     sub.l    start_point2(pc),d2
  4269.     addq.l    #2,d2
  4270.     lsr.l    #2,d2
  4271.     move.l    size2(pc),d3
  4272.  
  4273.     move.l    start_point2(pc),d0
  4274.     sub.l    a2,d0
  4275.     lsr.l    #2,d0
  4276.     move.l    d0,offset
  4277.     add.l    d2,d0
  4278.     sub.l    d0,d3
  4279.  
  4280.     bsr    deconvolution_pcm
  4281.  
  4282.     bsr    waku2
  4283.     bsr    mfree_adpcm_b    *出来たデータを転送先へ
  4284.     bsr    mfree_pcm_b
  4285.     move.l    dest_size(pc),size2
  4286.     move.l    buffer3(pc),buffer2
  4287.     clr.l    start_point2
  4288.     clr.l    end_point2
  4289.     bsr    make_adpcm_b
  4290.     bmi    ext_deconvol
  4291.     move.l    buffer2(pc),a6
  4292.     move.l    size2(pc),d6
  4293.     move.w    #genten_b,genten_y
  4294.     bsr    dsp_wv
  4295.  
  4296.     btst.b    #0,work2(pc)
  4297.     beq    after_deconvol
  4298.     bsr    waku1
  4299.     move.l    buffer1(pc),a6
  4300.     move.l    size1(pc),d6
  4301.     move.w    #genten_a,genten_y
  4302.     bsr    dsp_wv
  4303. after_deconvol:
  4304.     tst.b    data_type    *後始末
  4305.     beq    @f
  4306.     bsr    calc_es_adpcm_a
  4307.     bsr    calc_es_adpcm_b
  4308. @@:
  4309.     bsr    init_hex_area_a
  4310.     bsr    init_hex_area_b
  4311.     bsr    put_pt1
  4312. ext_deconvol:
  4313.     bra    non_ope
  4314.  
  4315. deconvolution_pcm:        *2つのPCMデータの逆たたみ込みを行なう
  4316.     * < a1=data1 addr, d1=size1
  4317.     * < a2=data2 base addr
  4318.     * < offset of data2
  4319.     * < d2=effective size2, d3=tail size
  4320.     * > buffer3,dest_size
  4321.     movem.l    d0-d7/a0-a6,-(sp)
  4322.  
  4323.     move.l    #-1,-(sp)
  4324.     DOS    _MALLOC
  4325.     addq.w    #4,sp
  4326.     andi.l    #$00ffffff,d0
  4327.     move.l    d0,d5
  4328.     move.l    d5,-(sp)    *取れる限り確保(d5:size)
  4329.     DOS    _MALLOC
  4330.     addq.w    #4,sp
  4331. mem_er_dcnvl:
  4332.     move.l    d0,mm_error
  4333.     bsr    print_em
  4334.     bmi    ext_do_deconvol
  4335.     move.l    d0,buffer3
  4336.  
  4337.     move.l    offset(pc),d0
  4338.     bne    @f
  4339.     moveq.l    #0,d4        *total size
  4340.     move.l    buffer3(pc),a3    *オフセットなしならば
  4341.     bra    imp_clear_zero_dc
  4342. @@:
  4343.     lsl.l    #2,d0
  4344.     cmp.l    d5,d0
  4345.     bls    @f
  4346. go_mem_er_dcvl:
  4347.     moveq.l    #-1,d0        *memory error
  4348.     bra    mem_er_dcnvl
  4349. @@:
  4350.     movem.l    d1-d2/a1-a2,-(sp)    *データ2の頭の部分をコピー
  4351.     move.l    d0,d2        *size
  4352.     move.l    d0,d4
  4353.     moveq.l    #%00000101,d1    *mode
  4354.     movea.l    a2,a1        *source
  4355.     movea.l    buffer3(pc),a2    *dest
  4356.     lea    (a2,d2.l),a3    *next
  4357.     bsr    trans_dma
  4358.     movem.l    (sp)+,d1-d2/a1-a2
  4359. imp_clear_zero_dc:
  4360.     move.l    d2,d7
  4361.     lsl.l    #3,d7
  4362.  
  4363.     add.l    d7,d4
  4364.     cmp.l    d5,d4
  4365.     bhi    go_mem_er_dcvl    *memory error
  4366.  
  4367.                 *a1,d1調整
  4368.     lsl.l    d1        *data1 count
  4369. @@:
  4370.     tst.w    (a1)        *1桁目が0だとダメ
  4371.     bne    @f
  4372.     addq.w    #2,a1
  4373.     subq.l    #2,d1
  4374.     bhi    @b
  4375.     bra    ext_do_deconvol    *異常なケース
  4376. @@:
  4377.     move.l    a3,a0
  4378.     lsr.l    #2,d7
  4379.     move.l    offset(pc),d0
  4380.     lsl.l    #2,d0
  4381.     lea    (a2,d0.l),a4    *destのスタートポイントから
  4382.  
  4383.     move.w    (a1),d4
  4384. @@:
  4385.     move.w    (a4)+,d0
  4386.     muls    d4,d0
  4387.     move.l    d0,(a0)+
  4388.     subq.l    #1,d7
  4389.     bne    @b
  4390.  
  4391.     moveq.l    #16,d6        *shift counter
  4392.     move.l    d2,d4
  4393.     lsl.l    d4        *data2 count
  4394.     move.l    a1,a4
  4395.     move.l    a3,a5        *あとで使用
  4396.     pea    (a2)
  4397. dimp_lp0:
  4398.     move.l    a4,a1
  4399.     move.l    a3,a0
  4400.     move.l    (a0),d7
  4401.     divs    (a1),d7
  4402.     move.w    d7,(a2)+    *答えを保存
  4403.     move.l    d4,d2
  4404.     cmp.l    d1,d2
  4405.     bls    @f
  4406.     move.l    d1,d2
  4407. @@:
  4408.     tst.w    d7        *答えが0ならば演算は不要
  4409.     beq    next_a1_dc
  4410. dimp_lp1:
  4411.     move.w    (a1)+,d0
  4412.     muls    d7,d0
  4413.     asr.l    d6,d0
  4414.     sub.l    d0,(a0)+
  4415.     subq.l    #1,d2
  4416.     bne    dimp_lp1
  4417. next_a1_dc:
  4418.     addq.w    #4,a3
  4419.     subq.l    #1,d4
  4420.     bne    dimp_lp0
  4421.  
  4422.     move.l    a2,d0
  4423.     move.l    (sp)+,a0
  4424.     sub.l    a0,d0
  4425.     lsr.l    d0
  4426. @@:
  4427.     move.w    (a0)+,(a5)+
  4428.     subq.l    #1,d0
  4429.     bne    @b
  4430.  
  4431.     move.l    a5,d4
  4432.     sub.l    buffer3(pc),d4    *calc again total size
  4433.  
  4434.     lsl.l    #2,d3        *tail転送
  4435.     add.l    d3,d4
  4436.     cmp.l    d5,d4
  4437.     bhi    go_mem_er_dcvl    *memory error
  4438.     move.l    d3,d2        *size
  4439.     beq    @f
  4440.     moveq.l    #%00000101,d1    *mode
  4441.     movea.l    a2,a1        *source(a2は丁度いい値になっている)
  4442.     movea.l    a5,a2        *dest
  4443.     bsr    trans_dma
  4444. @@:
  4445.     move.l    d4,-(sp)
  4446.     move.l    buffer3(pc),-(sp)
  4447.     DOS    _SETBLOCK
  4448.     addq.w    #8,sp
  4449.     lsr.l    #2,d4
  4450.     move.l    d4,dest_size
  4451. ext_do_deconvol:
  4452.     movem.l    (sp)+,d0-d7/a0-a6
  4453.     rts
  4454.  
  4455. convolution_ope:        *2つのデータのたたみ込みを行なう
  4456.     movem.l    d0-d7/a0-a6,reg_buff2
  4457.     clr.b    work2        *init work2
  4458.     move.b    data_a(pc),d0
  4459.     and.b    data_b(pc),d0
  4460.     beq    ext_convol    *データが2つ無いならキャンセル
  4461.  
  4462.     bsr    clr_bottom
  4463.     lea    convol_mes(pc),a0
  4464.     display2_    (a0),%1111,0,28,11
  4465.     display2    mix_mes2,%0111,0,29,22
  4466.     display2    convol_mes3,%0111,0,30,26
  4467.     moveq.l    #22,d1
  4468.     moveq.l    #29,d2
  4469.     IOCS    _B_LOCATE
  4470.     IOCS    _OS_CURON
  4471.     DOS    _INKEY
  4472.     cmpi.b    #'1',d0
  4473.     sne    work1        *memory direction
  4474.     beq    @f
  4475.     cmpi.b    #'2',d0
  4476.     bne    ext_convol
  4477. @@:            *オフセット入力
  4478.     IOCS    _OS_CUROF
  4479.  
  4480.     bsr    get_pt1
  4481.     display2    cv_mes,%1110,41,15,14
  4482.                 *実際に作業を行う…
  4483.     tst.l    buffer2
  4484.     bne    @f
  4485.     move.b    #2,work2    *mark
  4486.     bsr    make_pcm_b
  4487.     bmi    ext_convol
  4488. @@:
  4489.     tst.b    data_type
  4490.     beq    @f
  4491.     bsr    calc_es_pcm_b
  4492. @@:                *bank_aの下準備
  4493.     tst.l    buffer1
  4494.     bne    @f
  4495.     bsr    make_pcm_a
  4496.     ori.b    #1,work2    *mark
  4497.     bmi    ext_convol
  4498. @@:
  4499.     tst.b    data_type
  4500.     beq    @f
  4501.     bsr    calc_es_pcm_a
  4502. @@:
  4503.     tst.b    work1        *direction?
  4504.     beq    case_atob_convol
  4505. *case_btoa:            *BからAへ
  4506.     move.l    start_point2(pc),a1
  4507.     move.l    end_point2(pc),d1
  4508.     sub.l    a1,d1
  4509.     addq.l    #2,d1
  4510.     lsr.l    #2,d1
  4511.  
  4512.     move.l    buffer1(pc),a2
  4513.     move.l    end_point1(pc),d2
  4514.     sub.l    start_point1(pc),d2
  4515.     addq.l    #2,d2
  4516.     lsr.l    #2,d2
  4517.     move.l    size1(pc),d3
  4518.  
  4519.     move.l    start_point1(pc),d0
  4520.     sub.l    a2,d0
  4521.     lsr.l    #2,d0
  4522.     move.l    d0,offset
  4523.     add.l    d2,d0
  4524.     sub.l    d0,d3
  4525.  
  4526.     bsr    convolution_pcm
  4527.  
  4528.     bsr    waku1
  4529.     bsr    mfree_adpcm_a    *出来たデータを転送先へ
  4530.     bsr    mfree_pcm_a
  4531.     move.l    dest_size(pc),size1
  4532.     move.l    buffer3(pc),buffer1
  4533.     clr.l    start_point1
  4534.     clr.l    end_point1
  4535.     bsr    make_adpcm_a
  4536.     bmi    ext_convol
  4537.     move.l    buffer1(pc),a6
  4538.     move.l    size1(pc),d6
  4539.     move.w    #genten_a,genten_y
  4540.     bsr    dsp_wv
  4541.  
  4542.     btst.b    #1,work2(pc)
  4543.     beq    after_convol
  4544.     bsr    waku2
  4545.     move.l    buffer2(pc),a6
  4546.     move.l    size2(pc),d6
  4547.     move.w    #genten_b,genten_y
  4548.     bsr    dsp_wv
  4549.     bra    after_convol
  4550. case_atob_convol:            *AからBへ
  4551.     move.l    start_point1(pc),a1
  4552.     move.l    end_point1(pc),d1
  4553.     sub.l    a1,d1
  4554.     addq.l    #2,d1
  4555.     lsr.l    #2,d1
  4556.  
  4557.     move.l    buffer2(pc),a2
  4558.     move.l    end_point2(pc),d2
  4559.     sub.l    start_point2(pc),d2
  4560.     addq.l    #2,d2
  4561.     lsr.l    #2,d2
  4562.     move.l    size2(pc),d3
  4563.  
  4564.     move.l    start_point2(pc),d0
  4565.     sub.l    a2,d0
  4566.     lsr.l    #2,d0
  4567.     move.l    d0,offset
  4568.     add.l    d2,d0
  4569.     sub.l    d0,d3
  4570.  
  4571.     bsr    convolution_pcm
  4572.  
  4573.     bsr    waku2
  4574.     bsr    mfree_adpcm_b    *出来たデータを転送先へ
  4575.     bsr    mfree_pcm_b
  4576.     move.l    dest_size(pc),size2
  4577.     move.l    buffer3(pc),buffer2
  4578.     clr.l    start_point2
  4579.     clr.l    end_point2
  4580.     bsr    make_adpcm_b
  4581.     bmi    ext_convol
  4582.     move.l    buffer2(pc),a6
  4583.     move.l    size2(pc),d6
  4584.     move.w    #genten_b,genten_y
  4585.     bsr    dsp_wv
  4586.  
  4587.     btst.b    #0,work2(pc)
  4588.     beq    after_convol
  4589.     bsr    waku1
  4590.     move.l    buffer1(pc),a6
  4591.     move.l    size1(pc),d6
  4592.     move.w    #genten_a,genten_y
  4593.     bsr    dsp_wv
  4594. after_convol:
  4595.     tst.b    data_type    *後始末
  4596.     beq    @f
  4597.     bsr    calc_es_adpcm_a
  4598.     bsr    calc_es_adpcm_b
  4599. @@:
  4600.     bsr    init_hex_area_a
  4601.     bsr    init_hex_area_b
  4602.     bsr    put_pt1
  4603. ext_convol:
  4604.     bra    non_ope
  4605.  
  4606. convolution_pcm:        *2つのPCMデータのたたみ込みを行なう
  4607.     * < a1=data1 addr, d1=size1
  4608.     * < a2=data2 base addr
  4609.     * < offset of data2
  4610.     * < d2=effective size2, d3=tail size
  4611.     * > buffer3,dest_size
  4612.     movem.l    d0-d7/a0-a6,-(sp)
  4613.  
  4614.     move.l    #-1,-(sp)
  4615.     DOS    _MALLOC
  4616.     addq.w    #4,sp
  4617.     andi.l    #$00ffffff,d0
  4618.     move.l    d0,d5
  4619.     move.l    d5,-(sp)    *取れる限り確保(d5:size)
  4620.     DOS    _MALLOC
  4621.     addq.w    #4,sp
  4622. mem_er_cnvl:
  4623.     move.l    d0,mm_error
  4624.     bsr    print_em
  4625.     bmi    ext_do_convol
  4626.     move.l    d0,buffer3
  4627.  
  4628.     move.l    offset(pc),d0
  4629.     bne    @f
  4630.     moveq.l    #0,d4        *total size
  4631.     move.l    buffer3(pc),a3    *オフセットなしならば
  4632.     bra    imp_clear_zero
  4633. @@:
  4634.     lsl.l    #2,d0
  4635.     cmp.l    d5,d0
  4636.     bls    @f
  4637. go_mem_er_cvl:
  4638.     moveq.l    #-1,d0        *memory error
  4639.     bra    mem_er_cnvl
  4640. @@:
  4641.     movem.l    d1-d2/a1-a2,-(sp)    *データ2の頭の部分をコピー
  4642.     move.l    d0,d2        *size
  4643.     move.l    d0,d4
  4644.     moveq.l    #%00000101,d1    *mode
  4645.     movea.l    a2,a1        *source
  4646.     movea.l    buffer3(pc),a2    *dest
  4647.     lea    (a2,d2.l),a3    *next
  4648.     bsr    trans_dma
  4649.     movem.l    (sp)+,d1-d2/a1-a2
  4650. imp_clear_zero:
  4651.     move.l    d1,d6
  4652.     move.l    d2,d7
  4653.     lsl.l    #3,d6
  4654.     lsl.l    #3,d7
  4655.     add.l    d6,d7
  4656.     subq.l    #4,d7
  4657.  
  4658.     add.l    d7,d4
  4659.     cmp.l    d5,d4
  4660.     bhi    go_mem_er_cvl    *memory error
  4661.  
  4662.     move.l    a3,a0
  4663.     lsr.l    #2,d7
  4664.     move.l    d7,d6        *あとで使用
  4665. @@:
  4666.     clr.l    (a0)+        *zero clear
  4667.     subq.l    #1,d7
  4668.     bne    @b
  4669.  
  4670.     move.l    offset(pc),d0
  4671.     lsl.l    #2,d0
  4672.     lea    (a2,d0.l),a4    *data2 effective addr.
  4673.  
  4674.     move.l    d2,d4
  4675.     lsl.l    d4        *data2 count
  4676.  
  4677.     lsl.l    d1        *data1 count
  4678.  
  4679.     move.l    a3,a5        *あとで使用
  4680. imp_lp0:
  4681.     move.w    (a1)+,d7
  4682.     beq    next_a1_
  4683.     move.l    d4,d2
  4684.     move.l    a4,a2
  4685.     move.l    a3,a0
  4686. imp_lp1:
  4687.     move.w    (a2)+,d0
  4688.     muls    d7,d0
  4689.     add.l    d0,(a0)+
  4690.     subq.l    #1,d2
  4691.     bne    imp_lp1
  4692. next_a1_:
  4693.     addq.w    #4,a3
  4694.     subq.l    #1,d1
  4695.     bne    imp_lp0
  4696.  
  4697.     move.l    a5,a0
  4698. @@:
  4699.     move.l    (a5)+,d0
  4700.     swap    d0
  4701.     move.w    d0,(a0)+
  4702.     subq.l    #1,d6
  4703.     bne    @b
  4704.  
  4705.     move.l    a0,d4
  4706.     sub.l    buffer3(pc),d4    *calc again total size
  4707.  
  4708.     lsl.l    #2,d3        *tail転送
  4709.     add.l    d3,d4
  4710.     cmp.l    d5,d4
  4711.     bhi    go_mem_er_cvl    *memory error
  4712.     move.l    d3,d2        *size
  4713.     beq    @f
  4714.     moveq.l    #%00000101,d1    *mode
  4715.     movea.l    a2,a1        *source(a2は丁度いい値になっている)
  4716.     movea.l    a0,a2        *dest
  4717.     bsr    trans_dma
  4718. @@:
  4719.     move.l    d4,-(sp)
  4720.     move.l    buffer3(pc),-(sp)
  4721.     DOS    _SETBLOCK
  4722.     addq.w    #8,sp
  4723.     lsr.l    #2,d4
  4724.     move.l    d4,dest_size
  4725. ext_do_convol:
  4726.     movem.l    (sp)+,d0-d7/a0-a6
  4727.     rts
  4728.  
  4729. insert:                *データをはめこむ
  4730.     movem.l    d0-d7/a0-a6,reg_buff2
  4731.     clr.b    work2        *init work2
  4732.     st.b    mix_mode
  4733.     move.b    data_a(pc),d0
  4734.     and.b    data_b(pc),d0
  4735.     beq    ext_mix        *データが2つ無いならキャンセル
  4736.  
  4737.     bsr    clr_bottom
  4738.     lea    ins_mes(pc),a0
  4739.     bra    dsp_mix_mes
  4740.  
  4741. copy_data:            *データのコピー
  4742.     movem.l    d0-d7/a0-a6,reg_buff2
  4743.     move.b    data_a(pc),d0
  4744.     or.b    data_b(pc),d0
  4745.     beq    ext_mix        *データが両方無いならキャンセル
  4746.  
  4747.     bsr    clr_bottom
  4748.     display2    cpd_mes,%1111,0,28,9
  4749.     display2    mix_mes2,%0111,0,29,22
  4750.     display2    copy_mes3,%0111,0,30,19
  4751.     moveq.l    #22,d1
  4752.     moveq.l    #29,d2
  4753.     IOCS    _B_LOCATE
  4754.     IOCS    _OS_CURON
  4755.     DOS    _INKEY
  4756.     cmpi.b    #'1',d0
  4757.     sne    work1        *memory direction
  4758.     beq    cpd1
  4759.     cmpi.b    #'2',d0
  4760.     beq    cpd1
  4761.     bra    ext_cpd
  4762. cpd1:
  4763.     IOCS    _OS_CUROF
  4764.  
  4765.     bsr    get_pt1
  4766.     display2    cv_mes,%1110,41,15,14
  4767.  
  4768.     tst.b    work1
  4769.     bne    copy_btoa
  4770. *copy_atob:
  4771.     tst.b    data_a
  4772.     beq    ext_cpd
  4773.     move.l    end_point1(pc),a5
  4774.     move.l    start_point1(pc),a4
  4775.     tst.b    data_type
  4776.     bne    cab0
  4777.     sub.l    buffer1(pc),a5
  4778.     sub.l    buffer1(pc),a4
  4779.     lea    buffer2(pc),a3
  4780.     bra    cab00
  4781. cab0:
  4782.     sub.l    address1(pc),a5
  4783.     sub.l    address1(pc),a4
  4784.     lea    address2(pc),a3
  4785. cab00:
  4786.     clr.l    start_point2
  4787.     clr.l    end_point2
  4788.     bsr    waku2
  4789.     move.l    size1(pc),d2
  4790.     move.l    d2,size2    *d2=size
  4791.     move.l    address1(pc),a1    *a1=source
  4792.     bsr    mfree_adpcm_b
  4793.     tst.l    address1
  4794.     beq    cab1        *goto pcm data trans
  4795.     move.l    d2,-(sp)
  4796.     DOS    _MALLOC
  4797.     addq.w    #4,sp
  4798.     move.l    d0,mm_error
  4799.     bsr    print_em
  4800.     bmi    ext_cpd        *case:error
  4801.     movea.l    d0,a2        *a2=destination
  4802.     move.l    a2,address2
  4803.     moveq.l    #5,d1        *mode
  4804.     bsr    trans_dma
  4805. cab1:                *copy pcm data
  4806.     lsl.l    #2,d2        *size
  4807.     move.l    buffer1(pc),a1
  4808.     bsr    mfree_pcm_b
  4809.     tst.l    buffer1
  4810.     beq    cab2
  4811.     move.l    d2,-(sp)
  4812.     DOS    _MALLOC
  4813.     addq.w    #4,sp
  4814.     move.l    d0,mm_error
  4815.     bsr    print_em
  4816.     beq    cab11
  4817.     bsr    mfree_adpcm_b    *case:error
  4818.     bra    ext_cpd
  4819. cab11:
  4820.     movea.l    d0,a2
  4821.     move.l    a2,buffer2
  4822.     moveq.l    #5,d1        *mode
  4823.     bsr    trans_dma
  4824.     move.l    size2(pc),d6    *size
  4825.     move.l    a2,a6        *addr.
  4826.     move.w    #genten_b,genten_y
  4827.     bsr    dsp_wv
  4828.     bra    cab2_
  4829. cab2:
  4830.     move.l    size2(pc),d6    *size
  4831.     move.l    address2(pc),a6    *address
  4832.     move.w    #genten_b,genten_y
  4833.     bsr    dsp_wv_2
  4834. cab2_:
  4835.     st    data_b
  4836.     add.l    (a3),a4        *dest start point
  4837.     move.l    a4,start_point2
  4838.     add.l    (a3),a5        *dest end point
  4839.     move.l    a5,end_point2
  4840.     bsr    init_hex_area_b
  4841.     bra    ext_cpd
  4842. copy_btoa:
  4843.     tst.b    data_b
  4844.     beq    ext_cpd
  4845.     move.l    end_point2(pc),a5
  4846.     move.l    start_point2(pc),a4
  4847.     tst.b    data_type
  4848.     bne    cba0
  4849.     sub.l    buffer2(pc),a5
  4850.     sub.l    buffer2(pc),a4
  4851.     lea    buffer1(pc),a3
  4852.     bra    cba00
  4853. cba0:
  4854.     sub.l    address2(pc),a5
  4855.     sub.l    address2(pc),a4
  4856.     lea    address1(pc),a3
  4857. cba00:
  4858.     clr.l    start_point1
  4859.     clr.l    end_point1
  4860.     bsr    waku1
  4861.     move.l    size2(pc),d2
  4862.     move.l    d2,size1    *d2=size
  4863.     move.l    address2(pc),a1    *a1=source
  4864.     bsr    mfree_adpcm_a
  4865.     tst.l    address2
  4866.     beq    cba1        *goto pcm data trans
  4867.     move.l    d2,-(sp)
  4868.     DOS    _MALLOC
  4869.     addq.w    #4,sp
  4870.     move.l    d0,mm_error
  4871.     bsr    print_em
  4872.     bmi    ext_cpd        *case:error
  4873.     movea.l    d0,a2        *a2=destination
  4874.     move.l    a2,address1
  4875.     moveq.l    #5,d1        *mode
  4876.     bsr    trans_dma
  4877. cba1:                *copy pcm data
  4878.     lsl.l    #2,d2        *size
  4879.     move.l    buffer2(pc),a1
  4880.     bsr    mfree_pcm_a
  4881.     tst.l    buffer2
  4882.     beq    cba2
  4883.     move.l    d2,-(sp)
  4884.     DOS    _MALLOC
  4885.     addq.w    #4,sp
  4886.     move.l    d0,mm_error
  4887.     bsr    print_em
  4888.     beq    cba11
  4889.     bsr    mfree_adpcm_a    *case:error
  4890.     bra    ext_cpd
  4891. cba11:
  4892.     movea.l    d0,a2
  4893.     move.l    a2,buffer1
  4894.     moveq.l    #5,d1        *mode
  4895.     bsr    trans_dma
  4896.     move.l    size1(pc),d6    *size
  4897.     move.l    a2,a6        *addr.
  4898.     move.w    #genten_a,genten_y
  4899.     bsr    dsp_wv
  4900.     bra    cba2_
  4901. cba2:
  4902.     move.l    size1(pc),d6    *size
  4903.     move.l    address1(pc),a6    *address
  4904.     move.w    #genten_a,genten_y
  4905.     bsr    dsp_wv_2
  4906. cba2_:
  4907.     st    data_a
  4908.     add.l    (a3),a4        *dest start point
  4909.     move.l    a4,start_point1
  4910.     add.l    (a3),a5        *dest end point
  4911.     move.l    a5,end_point1
  4912.     bsr    init_hex_area_a
  4913. ext_cpd:
  4914.     bsr    put_pt1
  4915.     bra    non_ope
  4916.  
  4917. effect:                *エフェクトをかける
  4918.     movem.l    d0-d7/a0-a6,reg_buff2
  4919.     move.b    data_a(pc),d0
  4920.     or.b    data_b(pc),d0
  4921.     beq    ext_efct
  4922.  
  4923.     bsr    clr_bottom
  4924.     display2    efct_mes,%1111,0,28,13
  4925.     display2    disk_md_mes2,%0111,0,29,16    *select job.
  4926.     display2    efct_mes2,%0111,0,30,96        *menu
  4927.     moveq.l    #16,d1
  4928.     moveq.l    #29,d2
  4929.     IOCS    _B_LOCATE
  4930.     IOCS    _OS_CURON
  4931.     DOS    _INKEY
  4932.  
  4933.     move.b    d0,d1
  4934.     andi.b    #$DF,d1
  4935.  
  4936.     moveq.l    #0,d2        *d2=0
  4937.     cmpi.b    #'U',d1        *up / down
  4938.     beq    efct
  4939.  
  4940.     addq.b    #2,d2        *d2=2
  4941.     cmpi.b    #'L',d1        *left / right
  4942.     beq    efct
  4943.  
  4944.     addq.b    #2,d2        *d2=4
  4945.     cmpi.b    #'A',d1        *add 0
  4946.     beq    efct
  4947.  
  4948.     addq.l    #2,d2        *d2=6
  4949.     cmpi.b    #'R',d1        *reverse
  4950.     beq    efct
  4951.  
  4952.     addq.b    #2,d2        *d2=8
  4953.     cmpi.b    #'C',d1        *chorus
  4954.     beq    efct
  4955.  
  4956.     addq.b    #2,d2        *d2=10
  4957.     cmpi.b    #'D',d1        *delay
  4958.     beq    efct
  4959.  
  4960.     addq.b    #2,d2        *d2=12
  4961.     cmpi.b    #'S',d1        *sfx
  4962.     beq    efct
  4963.  
  4964.     addq.b    #2,d2        *d2=14
  4965.     cmpi.b    #'F',d1        *filter
  4966.     beq    efct
  4967.  
  4968.     addq.b    #2,d2        *d2=16
  4969.     cmpi.b    #'E',d1        *fade in/out
  4970.     beq    efct
  4971.  
  4972.     moveq.l    #0,d2        *d2=0
  4973.     cmpi.b    #'1',d0
  4974.     beq    efct
  4975.  
  4976.     addq.b    #2,d2        *d2=2
  4977.     cmpi.b    #'2',d0
  4978.     beq    efct
  4979.  
  4980.     addq.b    #2,d2        *d2=4
  4981.     cmpi.b    #'3',d0
  4982.     beq    efct
  4983.  
  4984.     addq.b    #2,d2        *d2=6
  4985.     cmpi.b    #'4',d0
  4986.     beq    efct
  4987.  
  4988.     addq.b    #2,d2        *d2=8
  4989.     cmpi.b    #'5',d0
  4990.     beq    efct
  4991.  
  4992.     addq.b    #2,d2        *d2=10
  4993.     cmpi.b    #'6',d0
  4994.     beq    efct
  4995.  
  4996.     addq.b    #2,d2        *d2=12
  4997.     cmpi.b    #'7',d0
  4998.     beq    efct
  4999.  
  5000.     addq.b    #2,d2        *d2=14
  5001.     cmpi.b    #'8',d0
  5002.     beq    efct
  5003.  
  5004.     addq.b    #2,d2        *d2=16
  5005.     cmpi.b    #'9',d0
  5006.     beq    efct
  5007.  
  5008.     bra    ext_efct
  5009. efct:
  5010.     move.w    d2,work1    *mark job number
  5011.     cmpi.b    #4,d2
  5012.     bls    @f
  5013.     cmpi.b    #16,d2
  5014.     bne    efct_curof
  5015. @@:
  5016.     bsr    clr_bottom
  5017.     tst.b    d2
  5018.     beq    case_ud        *up down
  5019.     cmpi.b    #4,d2
  5020.     beq    case_ad
  5021.     cmpi.b    #16,d2
  5022.     beq    case_en
  5023.     display2    l_r_mes,%1111,0,28,16    *left or right
  5024.     bra    dsp_ofs?
  5025. case_ad:
  5026.     display2    ad_mes,%1111,0,28,15    *add 0 to tail
  5027.     display2    howmany0,%0111,0,29,31    *input offset value
  5028.     moveq.l    #0,d1
  5029.     moveq.l    #30,d2
  5030.     IOCS    _B_LOCATE
  5031.     bra    getlninp
  5032. case_ud:
  5033.     display2    up_down_mes,%1111,0,28,13    *up or down
  5034.     bra    dsp_ofs?
  5035. case_en:
  5036.     display2    env_mes,%1111,0,28,18    *change an envelope
  5037.     bra    get_inout
  5038. dsp_ofs?:
  5039.     display2    up_down_mes2,%0111,0,29,19    *input offset value
  5040.     moveq.l    #19,d1
  5041.     moveq.l    #29,d2
  5042.     IOCS    _B_LOCATE
  5043. getlninp:
  5044.     lea    input_buffer(pc),a1
  5045.     move.b    #6,(a1)
  5046.     pea    (a1)
  5047.     DOS    _GETS        *一行入力
  5048.     addq.w    #4,sp
  5049.  
  5050.     addq.w    #2,a1        *chr data buffer
  5051.  
  5052.     cmpi.b    #$20,(a1)
  5053.     bls    ext_efct    *スペースよりも小さい時はキャンセル
  5054.  
  5055.     bsr    get_num
  5056.     move.l    d1,d0
  5057.     bpl    @f
  5058.     neg.l    d0
  5059. @@:
  5060.     cmpi.l    #65535,d0
  5061.     bhi    ext_efct    *数が巨大すぎるならキャンセル
  5062.  
  5063.     tst.b    data_type
  5064.     bne    sv_ofst
  5065.     move.w    work1(pc),d0    *job内容によりパラメータが適性かどうか検査
  5066.     cmpi.w    #4,d0
  5067.     bne    @f
  5068. even_pls:
  5069.     addq.w    #1,d1        *case:add 0 to tail
  5070.     bclr.l    #0,d1        *.even plus
  5071.     bra    sv_ofst
  5072. @@:
  5073.     cmpi.b    #2,d0        *case:left/right shift
  5074.     bne    @f
  5075.     tst.w    d1
  5076.     bpl    even_pls
  5077.     subq.w    #1,d1
  5078.     bclr.l    #0,d1        *.even minus
  5079.     bra    sv_ofst
  5080. @@:
  5081. sv_ofst:
  5082.     move.w    d1,offset    *save offset
  5083.     beq    ext_efct    *数が0ならキャンセル
  5084.     bra    efct_curof
  5085. get_inout:                *in/out levelの設定
  5086.     display2    inout_mes,%0111,0,29,19    *input fade in/out level
  5087.     moveq.l    #19,d1
  5088.     moveq.l    #29,d2
  5089.     IOCS    _B_LOCATE
  5090.  
  5091.     lea    input_buffer(pc),a1
  5092.     move.b    #3,(a1)
  5093.     pea    (a1)
  5094.     DOS    _GETS        *一行入力
  5095.     addq.w    #4,sp
  5096.  
  5097.     addq.w    #2,a1        *chr data buffer
  5098.  
  5099.     cmpi.b    #$20,(a1)
  5100.     bls    ext_efct    *スペースよりも小さい時はキャンセル
  5101.  
  5102.     bsr    get_num
  5103.     cmpi.w    #127,d1
  5104.     bhi    ext_efct
  5105.     move.w    d1,work2    *save level
  5106.  
  5107.             *input fade in or out
  5108.     display2    sel_mode_mes,%0111,0,30,28
  5109.     moveq.l    #28,d1
  5110.     moveq.l    #30,d2
  5111.     IOCS    _B_LOCATE
  5112.     DOS    _INKEY
  5113.     cmpi.b    #'1',d0
  5114.     beq    sv_env_mode
  5115.     cmpi.b    #'2',d0
  5116.     bne    ext_efct
  5117. sv_env_mode:
  5118.     move.b    d0,work3
  5119.  
  5120. efct_curof:
  5121.     IOCS    _OS_CUROF
  5122.  
  5123.     bsr    get_pt1
  5124.     display2    cv_mes,%1110,41,15,14
  5125.                 *実際に作業を行う…
  5126.     lea    address1(pc),a0
  5127.     tst.b    bank_sel
  5128.     beq    efct1
  5129.  
  5130.     tst.b    data_b        *bank_bの下準備
  5131.     beq    ext_efct
  5132.     lea    20(a0),a0        *bank_b base addr.
  5133.     tst.l    pbuffer(a0)
  5134.     bne    efct0
  5135.     bsr    make_pcm_b
  5136.     bmi    ext_efct
  5137. efct0:
  5138.     tst.b    data_type
  5139.     beq    efct2
  5140.     bsr    calc_es_pcm_b
  5141.     bra    efct2
  5142. efct1:                *bank_aの下準備
  5143.     tst.b    data_a
  5144.     beq    ext_efct
  5145.     tst.l    pbuffer(a0)
  5146.     bne    efct11
  5147.     bsr    make_pcm_a
  5148.     bmi    ext_efct
  5149. efct11:
  5150.     tst.b    data_type
  5151.     beq    efct2
  5152.     bsr    calc_es_pcm_a
  5153. efct2:
  5154.     movea.l    pstart(a0),a1    *a1=pcm start addr.
  5155.     move.l    pend(a0),d2
  5156.     sub.l    a1,d2
  5157.     addq.l    #2,d2        *d2=data size
  5158.  
  5159.     move.w    work1(pc),d6
  5160.     move.w    efct_jmp(pc,d6.w),a6
  5161.     jmp    efct_jmp(pc,a6.w)
  5162. efct3:
  5163.     bra    atoshimatsu
  5164. efct_jmp:
  5165.     dc.w    up_down_shift-efct_jmp,left_right-efct_jmp
  5166.     dc.w    add0-efct_jmp,reverse-efct_jmp
  5167.     dc.w    chorus-efct_jmp,delay-efct_jmp
  5168.     dc.w    sfx-efct_jmp,filting-efct_jmp
  5169.     dc.w    chg_env-efct_jmp
  5170. reverse:            *pcm dataを逆転する
  5171.     move.l    d2,-(sp)    *d2=size
  5172.     DOS    _MALLOC
  5173.     addq.w    #4,sp
  5174.     move.l    d0,mm_error
  5175.     bsr    print_em
  5176.     bmi    ext_efct    *case:error
  5177.     move.l    d0,work2
  5178.     move.l    d0,a2        *dest
  5179.     moveq.l    #5,d1        *mode
  5180.     bsr    trans_dma
  5181.  
  5182.     add.l    d2,a2
  5183. rev_lp:
  5184.     move.w    -(a2),(a1)+    *なんかMC68000って凄いよな…
  5185.     subq.l    #2,d2
  5186.     bne    rev_lp
  5187.  
  5188.     move.l    work2(pc),-(sp)
  5189.     DOS    _MFREE
  5190.     addq.w    #4,sp
  5191.     bra    efct3
  5192.  
  5193. up_down_shift:
  5194.     move.w    offset(pc),d3
  5195.     move.l    d2,d1
  5196. uds_lp:
  5197.     move.w    (a1),d2
  5198.     add.w    d3,d2
  5199. *    bsr    chk_ovf
  5200.     move.w    d2,(a1)+
  5201.     subq.l    #2,d1
  5202.     bne    uds_lp
  5203.     bra    efct3
  5204.  
  5205. left_right:
  5206.     * < a0=parameter base address
  5207.     * < a1=pcm start
  5208.     * < d2=data size
  5209.     move.w    offset(pc),d6
  5210.     ext.l    d6
  5211.     bsr    remk_ofs
  5212.     tst.l    d6
  5213.     bpl    case_right
  5214. *case_left:
  5215.     neg.l    d6
  5216.     move.l    a1,a2    *dest.
  5217.     add.l    d6,a1    *source
  5218.     move.l    psize(a0),d2
  5219.     lsl.l    #2,d2
  5220.     add.l    pbuffer(a0),d2
  5221.     sub.l    pstart(a0),d2    *start_p~data endまでのサイズ
  5222.     move.l    d2,d0        *保存
  5223.     sub.l    d6,d2        *転送バイト数
  5224.     bcc    @f
  5225.     moveq.l    #0,d6        *転送バイト数異常のケース
  5226.     move.l    d0,d2
  5227.     bra    sv_new_ep
  5228. @@:
  5229.     moveq.l    #5,d1    *mode
  5230.     bsr    trans_dma
  5231. sv_new_ep:
  5232.     sub.l    d6,pend(a0)    *new end point
  5233.  
  5234.     move.l    pstart(a0),d0
  5235.     sub.l    pbuffer(a0),d0    *start_pまでのサイズ
  5236.     add.l    d0,d2        *new size
  5237.     move.l    d2,-(sp)    *縮小
  5238.     move.l    pbuffer(a0),-(sp)
  5239.     DOS    _SETBLOCK
  5240.     addq.w    #8,sp
  5241.  
  5242.     lsr.l    #2,d2
  5243.     move.l    d2,psize(a0)
  5244.     tst.l    paddress(a0)
  5245.     beq    atoshimatsu    *adpcm bufferがないなら…
  5246.  
  5247.     move.l    d2,-(sp)
  5248.     move.l    paddress(a0),-(sp)
  5249.     DOS    _SETBLOCK
  5250.     addq.w    #8,sp
  5251.     bra    atoshimatsu
  5252.  
  5253. case_right:
  5254.     move.l    psize(a0),d4
  5255.     lsl.l    #2,d4
  5256.     add.l    d6,d4
  5257.     move.l    d4,-(sp)
  5258.     DOS    _MALLOC
  5259.     addq.w    #4,sp
  5260.     move.l    d0,mm_error
  5261.     bsr    print_em
  5262.     bmi    ext_efct    *case:error
  5263.     move.l    d0,a2
  5264.     move.l    a2,-(sp)    *保存
  5265.     move.l    pbuffer(a0),a1    *source
  5266.     move.l    pstart(a0),d2
  5267.     sub.l    pbuffer(a0),d2
  5268.     moveq.l    #5,d1
  5269.     bsr    trans_dma    *先頭部転送
  5270.  
  5271.     add.l    d2,a2
  5272.     move.l    d6,d0
  5273.     lsr.l    #2,d0
  5274. cr_lp:
  5275.     clr.l    (a2)+        *ダミー部
  5276.     subq.l    #1,d0
  5277.     bne    cr_lp
  5278.  
  5279.     move.l    pstart(a0),a1    *source
  5280.     move.l    psize(a0),d2
  5281.     lsl.l    #2,d2
  5282.     add.l    pbuffer(a0),d2
  5283.     sub.l    pstart(a0),d2    *start_p~data endまでのサイズ
  5284.     bsr    trans_dma    *メイン部を転送
  5285.  
  5286.     add.l    d6,pend(a0)
  5287.     move.l    pbuffer(a0),d0
  5288.     sub.l    d0,pstart(a0)
  5289.     sub.l    d0,pend(a0)    *一時的に…
  5290. mk_new_prm:
  5291.     tst.b    bank_sel
  5292.     bne    cr_bank_b
  5293. *cr_bank_a:
  5294.     bsr    mfree_adpcm_a
  5295.     bsr    mfree_pcm_a
  5296.     bra    cr_new_adr
  5297. cr_bank_b:
  5298.     bsr    mfree_adpcm_b
  5299.     bsr    mfree_pcm_b
  5300. cr_new_adr:
  5301.     move.l    (sp)+,d0
  5302.     move.l    d0,pbuffer(a0)
  5303.     add.l    d0,pstart(a0)
  5304.     add.l    d0,pend(a0)
  5305.     lsr.l    #2,d4
  5306.     move.l    d4,psize(a0)    *new size
  5307.     bra    atoshimatsu
  5308.  
  5309. add0:                *end pointの最後尾にゼロを加える
  5310.     * < a0=parameter base address
  5311.     * < a1=pcm start
  5312.     * < d2=data size
  5313.     moveq.l    #0,d6
  5314.     move.w    offset(pc),d6
  5315.     bsr    remk_ofs
  5316.  
  5317.     move.l    psize(a0),d4
  5318.     lsl.l    #2,d4
  5319.     add.l    d6,d4
  5320.     move.l    d4,-(sp)
  5321.     DOS    _MALLOC
  5322.     addq.w    #4,sp
  5323.     move.l    d0,mm_error
  5324.     bsr    print_em
  5325.     bmi    ext_efct    *case:error
  5326.     move.l    d0,a2        *destination
  5327.     move.l    a2,-(sp)    *保存
  5328.     move.l    pbuffer(a0),a1    *source
  5329.     move.l    pend(a0),d2
  5330.     sub.l    pbuffer(a0),d2
  5331.     addq.l    #2,d2
  5332.     moveq.l    #5,d1
  5333.     bsr    trans_dma    *先頭部転送
  5334.  
  5335.     add.l    d2,a2
  5336.     move.l    d6,d0
  5337.     lsr.l    #2,d0
  5338. cr_lp2:
  5339.     clr.l    (a2)+        *ダミー部
  5340.     subq.l    #1,d0
  5341.     bne    cr_lp2
  5342.  
  5343.     move.l    pend(a0),a1    *source
  5344.     addq.w    #2,a1
  5345.     move.l    psize(a0),d2
  5346.     lsl.l    #2,d2
  5347.     add.l    pbuffer(a0),d2
  5348.     sub.l    pend(a0),d2    *end_p~data endまでのサイズ
  5349.     subq.l    #2,d2
  5350.     bsr    trans_dma    *メイン部を転送
  5351.  
  5352.     add.l    d6,pend(a0)
  5353.     move.l    pbuffer(a0),d0
  5354.     sub.l    d0,pstart(a0)
  5355.     sub.l    d0,pend(a0)    *一時的に…
  5356.     bra    mk_new_prm
  5357.  
  5358. remk_ofs:        *オフセットをデータモードに応じて調整
  5359.     add.l    d6,d6
  5360.     tst.b    data_type
  5361.     bne    remk_ofs_adpcm
  5362.     rts
  5363. remk_ofs_adpcm:
  5364.     add.l    d6,d6
  5365.     rts
  5366. detune_up:    equ    64971    *64783
  5367. detune_down:    equ    570    *761
  5368. chorus:                *コーラス処理
  5369.     move.l    d2,-(sp)    *get work area
  5370.     DOS    _MALLOC
  5371.     addq.w    #4,sp
  5372.     move.l    d0,mm_error
  5373.     bsr    print_em
  5374.     bmi    ext_efct    *case:error
  5375.     move.l    d0,work2
  5376.     move.l    d0,a2
  5377.     moveq.l    #5,d1
  5378.     bsr    trans_dma    *copy to work area
  5379.  
  5380.     move.l    d2,d0
  5381.     lsr.l    d0        *d0=data count
  5382.     exg.l    a1,a2        *a1=destination a2=source
  5383.     moveq.l    #1,d6
  5384.     move.l    #detune_up,d4
  5385.     move.w    #40,work1    *ボリューム値
  5386.     bsr    do_pitch2
  5387.     move.l    #detune_down,d4
  5388.     st    d6
  5389.     move.w    #20,work1    *ボリューム値
  5390.     bsr    do_pitch2
  5391.  
  5392.     bsr    trans_dma    *パラメータはもう設定済み
  5393.  
  5394.     move.l    work2(pc),-(sp)
  5395.     DOS    _MFREE
  5396.     addq.w    #4,sp
  5397.     bra    efct3
  5398.  
  5399. delay:                *ディレイ処理
  5400.     move.l    d2,-(sp)    *get work area
  5401.     DOS    _MALLOC
  5402.     addq.w    #4,sp
  5403.     move.l    d0,mm_error
  5404.     bsr    print_em
  5405.     bmi    ext_efct    *case:error
  5406.     move.l    d0,work2
  5407.     move.l    d0,a2
  5408.     moveq.l    #5,d1
  5409.     bsr    trans_dma    *copy to work area
  5410.  
  5411.     pea    (a1)        *keep start data
  5412.     move.l    d2,d0
  5413.     lsr.l    d0        *d0=data count
  5414.     move.w    #10,work1
  5415.     moveq.l    #5,d3
  5416.     sub.b    sampling_rate(pc),d3
  5417.     mulu    #3900,d3
  5418.     move.l    d3,d4
  5419.     lsr.l    d4
  5420. dly_lp:
  5421.     adda.l    d3,a2
  5422.     sub.l    d4,d0
  5423.     beq    dly1
  5424.     bmi    dly1
  5425.     subq.w    #2,work1
  5426.     beq    dly1
  5427.     bmi    dly1
  5428.  
  5429.     bsr    do_mix2
  5430.     bra    dly_lp
  5431. dly1:
  5432.     move.l    (sp)+,a2    *a2=destination
  5433.     move.l    work2(pc),a1    *a1=source
  5434.     bsr    trans_dma    *パラメータはもう設定済み
  5435.  
  5436.     move.l    work2(pc),-(sp)
  5437.     DOS    _MFREE
  5438.     addq.w    #4,sp
  5439.     bra    efct3
  5440. sfx:                *特殊効果処理
  5441.     move.l    d2,-(sp)    *get work area
  5442.     DOS    _MALLOC
  5443.     addq.w    #4,sp
  5444.     move.l    d0,mm_error
  5445.     bsr    print_em
  5446.     bmi    ext_efct    *case:error
  5447.     move.l    d0,work2
  5448.     move.l    d0,a2
  5449.     moveq.l    #5,d1
  5450.     bsr    trans_dma    *copy to work area
  5451.  
  5452.     move.l    a1,-(sp)    *keep original start addr.
  5453.     move.w    #60,work1    *ボリューム値64/128
  5454.     exg.l    a1,a2        *a1=destination a2=source
  5455.     move.l    d2,d0
  5456.     lsr.l    d0        *d0=data count
  5457.     moveq.l    #1,d6        *up
  5458.     move.l    #65535,d4    *detune
  5459.     moveq.l    #5,d3
  5460.     sub.b    sampling_rate(pc),d3
  5461.     mulu    #400,d3
  5462.     move.l    d3,d5
  5463.     lsr.l    d5
  5464. sfx_lp:
  5465.     adda.l    d3,a1
  5466.     sub.l    d5,d0
  5467.     beq    sfx1
  5468.     bmi    sfx1
  5469.     subq.w    #4,work1
  5470.     beq    sfx1
  5471.     bmi    sfx1
  5472.     subq.w    #8,d4        *dec parameter
  5473.  
  5474.     bsr    do_pitch2
  5475.     bra    sfx_lp
  5476. sfx1:
  5477.     move.l    work2(pc),a1    *a1=source
  5478.     move.l    (sp)+,a2    *a2=destination
  5479.     bsr    trans_dma    *パラメータはもう設定済み
  5480.  
  5481.     move.l    work2(pc),-(sp)
  5482.     DOS    _MFREE
  5483.     addq.w    #4,sp
  5484.     bra    efct3
  5485.  
  5486. filting:            *平滑化を行う
  5487.     move.l    d2,-(sp)    *d2=size
  5488.     DOS    _MALLOC
  5489.     addq.w    #4,sp
  5490.     move.l    d0,mm_error
  5491.     bsr    print_em
  5492.     bmi    ext_efct    *case:error
  5493.     move.l    d0,work2
  5494.     move.l    d0,a2        *dest
  5495.     moveq.l    #5,d1        *mode
  5496.     bsr    trans_dma
  5497.  
  5498.     move.w    (a2)+,d0
  5499.     add.w    (a2),d0
  5500.     asr.w    d0
  5501.     move.w    d0,(a1)+
  5502.     subq.l    #2,d2
  5503.     beq    exit_filt
  5504.     moveq.l    #3,d1
  5505. flt_lp:
  5506.     cmpi.l    #2,d2
  5507.     beq    @f
  5508.     move.w    -2(a2),d0
  5509.     add.w    (a2)+,d0
  5510.     add.w    (a2),d0
  5511.     ext.l    d0
  5512.     divs    d1,d0
  5513.     move.w    d0,(a1)+
  5514.     subq.l    #2,d2
  5515.     bra    flt_lp
  5516. @@:
  5517.     move.w    -2(a2),d0
  5518.     add.w    (a2)+,d0
  5519.     asr.w    d0
  5520.     move.w    d0,(a1)+
  5521. exit_filt:
  5522.     move.l    work2(pc),-(sp)
  5523.     DOS    _MFREE
  5524.     addq.w    #4,sp
  5525.     bra    efct3
  5526.  
  5527. chg_env:            *エンベロープ変更
  5528.     * < a1.l=pcm data address
  5529.     * < d2.l=pcm data size
  5530.     * < work2.w=end in level(0-127)
  5531.     * < offset.w=offset point(0-65535)
  5532.     moveq.l    #0,d5
  5533.  
  5534.     cmpi.b    #'2',work3    *check mode
  5535.     beq    @f
  5536.                 *case:fade in
  5537.     move.w    work2(pc),d5    *get in level
  5538.     moveq.l    #1,d7
  5539.     bra    calc_fio
  5540. @@:                *case:fade out
  5541.     move.w    #128,d5
  5542.     moveq.l    #-1,d7
  5543. calc_fio:
  5544.     move.l    d2,d1
  5545.     lsr.l    d1        *fade count
  5546.     move.l    #128,d0
  5547.     sub.w    work2(pc),d0    *get in/end level
  5548.     move.l    d1,d3
  5549.     bsr    wari2        *d0.l/d1.l=d0.l...d1.l
  5550.     move.w    d0,d2        *step
  5551.     move.l    d1,d0
  5552.     swap    d0
  5553.     clr.w    d0        *d0=あまり*65536
  5554.     move.l    d3,d1
  5555.     bsr    wari2        *d0.l/d1.l=d0.l...d1.l
  5556.     tst.l    d1
  5557.     beq    @f
  5558.     addq.w    #1,d0
  5559. @@:
  5560.     move.l    d3,d1
  5561.     * < d0.w=rvs
  5562.     * < d1.l=count
  5563.     * < d2.w=step
  5564.     * < d3.b=rvs work
  5565.     * < d5.b=now out level
  5566.     * < a1.l=address
  5567.     tst.b    d7
  5568.     bpl    @f
  5569.     neg.b    d2        *case:fade out
  5570. @@:
  5571.     moveq.l    #0,d3        *init rvs work
  5572. fio_lp01:
  5573.     move.w    (a1),d6
  5574.     muls    d5,d6
  5575.     asr.l    #7,d6
  5576.     move.w    d6,(a1)+
  5577.     add.b    d2,d5        *add step
  5578.     add.w    d0,d3        *calc revise param.
  5579.     bcc    @f
  5580.     add.b    d7,d5
  5581. @@:
  5582.     subq.l    #1,d1
  5583.     bne    fio_lp01
  5584.     bra    efct3
  5585.  
  5586. exit_chen:
  5587.     bra    efct3
  5588.  
  5589. wari2:                *32ビット/32ビット=32ビット...32ビット
  5590.     * < d0.l/d1.l=d0.l ...d1.l
  5591.     cmpi.l    #$ffff,d1
  5592.     bls    _divx        *16ビット以下の数値なら1命令で処理
  5593.     cmp.l    d0,d1
  5594.     beq    _div01        *d0=d1商は1
  5595.     bls    _div02        *1命令では無理なケース
  5596.  
  5597.     move.l    d0,d1        *商は0余りはd0.l
  5598.     moveq.l    #0,d0
  5599.     rts
  5600. _div01:                *商は1余り0
  5601.     moveq.l    #1,d0
  5602.     moveq.l    #0,d1
  5603.     rts
  5604. _div02:
  5605.     movem.l    d3-d5,-(sp)
  5606.     move.l    d1,d3
  5607.     clr.w    d3
  5608.     swap    d3
  5609.     addq.l    #1,d3
  5610.     move.l    d0,d4
  5611.     move.l    d1,d5
  5612.     move.l    d3,d1
  5613.     bsr    _divx
  5614.     move.l    d5,d1
  5615.     divu    d3,d1
  5616.     divu    d1,d0
  5617.     andi.l    #$ffff,d0
  5618. _div03:
  5619.     move.l    d5,d1
  5620.     move.l    d5,d3
  5621.     swap    d3
  5622.     mulu    d0,d1
  5623.     mulu    d0,d3
  5624.     swap    d3
  5625.     add.l    d3,d1
  5626.     sub.l    d4,d1
  5627.     bhi    _div04
  5628.     neg.l    d1
  5629.     cmp.l    d1,d5
  5630.     bhi    _div05
  5631.     addq.l    #1,d0
  5632.     bra    _div03
  5633. _div04:
  5634.     subq.l    #1,d0
  5635.     bra    _div03
  5636. _div05:
  5637.     movem.l    (sp)+,d3-d5
  5638.     rts
  5639. _divx:
  5640.     movem.w    d0/d3,-(sp)
  5641.     clr.w    d0
  5642.     swap    d0
  5643.     divu    d1,d0
  5644.     move.w    d0,d3
  5645.     move.w    (sp)+,d0
  5646.     divu    d1,d0
  5647.     swap    d0
  5648.     moveq.l    #0,d1
  5649.     move.w    d0,d1
  5650.     move.w    d3,d0
  5651.     swap    d0
  5652.     move.w    (sp)+,d3
  5653.     rts
  5654.  
  5655. do_mix2:
  5656.     * mix data1 to data2
  5657.     * < a1=source pcm data
  5658.     * < a2=dest.  pcm data
  5659.     * < d0.l=data count
  5660.     movem.l    d0-d7/a0-a6,-(sp)
  5661. mix_lp2:
  5662.     moveq.l    #0,d2
  5663.     move.w    (a1)+,d2
  5664.     muls    work1(pc),d2
  5665.     asr.l    #7,d2
  5666.     add.w    (a2),d2
  5667. *    bsr    chk_ovf
  5668.     move.w    d2,(a2)+
  5669.     subq.l    #1,d0
  5670.     bne    mix_lp2
  5671.     movem.l    (sp)+,d0-d7/a0-a6
  5672.     rts
  5673.  
  5674. do_pitch2:            *ミキシングもする
  5675.     * < a2=source addr.
  5676.     * < a1=destination
  5677.     * < d0=number of source data
  5678.     * < d4=shift parameter
  5679.      * < d6=direction of pitch shift(-:shift down +:shift up)
  5680.     * < work1 (volume 1~128)
  5681.     * - ALL
  5682.     movem.l    d0-d7/a0-a6,-(sp)
  5683.     moveq.l    #0,d7
  5684.     moveq.l    #0,d3
  5685.     moveq.l    #0,d5
  5686.  
  5687. cvt_lp2:
  5688.     moveq.l    #0,d2
  5689.     move.w    (a2)+,d2
  5690.     muls    work1(pc),d2
  5691.     asr.l    #7,d2
  5692.  
  5693.     tst.b    d5    *初めて
  5694.     bne    _up_or_down2
  5695.     seq.b    d5
  5696.     bra    _wrt_dst_pcm_dt2
  5697. _up_or_down2:
  5698.     tst.b    d6
  5699.     bmi    _do_shift_down2
  5700.  
  5701.     move.w    d4,d1
  5702.     add.w    d1,d3
  5703.     bcc    _check_dsz2
  5704.     bra    _wrt_dst_pcm_dt2
  5705. _do_shift_down2:
  5706.     move.w    d4,d1
  5707.     beq    @f
  5708.     add.w    d1,d3
  5709.     bcc    _wrt_dst_pcm_dt2
  5710. @@:
  5711.     move.w    d2,d1
  5712.     add.w    d7,d1
  5713.     asr.w    d1        *線形補間
  5714.     add.w    d1,(a1)+    *store additional pcm data
  5715.     subq.l    #1,d0
  5716.     beq    dop2end
  5717. _wrt_dst_pcm_dt2:
  5718.     add.w    d2,(a1)+    *store pcm data to buffer
  5719. _check_dsz2:
  5720.     move.w    d2,d7
  5721.     subq.l    #1,d0
  5722.     bne    cvt_lp2
  5723. dop2end:
  5724.     movem.l    (sp)+,d0-d7/a0-a6
  5725.     rts
  5726.  
  5727. work:
  5728. bank_a:    dc.b    ' BANK A ',0
  5729. bank_b:    dc.b    ' BANK B ',0
  5730. stpt:    dc.b    'START POINT',0
  5731. edpt:    dc.b    'END   POINT',0
  5732. mt_on:    dc.b    'MONITOR:',0
  5733. on_msg:    dc.b    'ON ',0
  5734. of_msg:    dc.b    'OFF',0
  5735. dt_tp:    dc.b    'DATA TYPE:',0
  5736. tp_pcm:    dc.b    'PCM  ',0
  5737. tp_adp:    dc.b    'ADPCM',0
  5738. smp_tm:    dc.b    'SAMPLING TIME:',0
  5739. sec:    dc.b    $f3,'s',$f3,'e',$f3,'c',0
  5740. smp_sz:    dc.b    'SAMPLING SIZE:',0
  5741. bytes:    dc.b    $f3,'b',$f3,'y',$f3,'t',$f3,'e',$f3,'s',0
  5742. smp_rt:    dc.b    'SAMPLING RATE:',0
  5743. khz:    dc.b    $f3,'k',$f3,'H',$f3,'z',0
  5744. _39:    dc.b    ' 3.9'
  5745. _52:    dc.b    ' 5.2'
  5746. _78:    dc.b    ' 7.8'
  5747. _104:    dc.b    '10.4'
  5748. _156:    dc.b    '15.6'
  5749. out_as:    dc.b    'PANPOT:',0
  5750. mute:    dc.b    'MUTE  ',0,0
  5751. lft:    dc.b    'LEFT  ',0,0
  5752. rgt:    dc.b    'RIGHT ',0,0
  5753. mdd:    dc.b    'MIDDLE',0,0
  5754. at_md:    dc.b    'TRIGGER:',0
  5755. quit:    dc.b    'EXIT',0
  5756. play:    dc.b    'PLAY',0
  5757. rec:    dc.b    'RECORD',0
  5758. files:    dc.b    'DISK',0
  5759. pitch:    dc.b    'PITCH',0
  5760. level:    dc.b    'VOLUME',0
  5761. mix:    dc.b    'COMPOUND',0
  5762. _dir:    dc.b    '    <DIR> ',0
  5763. input_smpt_mes:    dc.b    'For how long will you sample the sound?',0
  5764. input_smsz_mes:    dc.b    'How much will ADPCM data use the memory?',0
  5765. adj_frq:    dc.b    'ADJUST FREQUENCY',0
  5766. bnd_frq:    dc.b    'PITCH-BEND',0
  5767. yajirushi:    dc.b    $f3,'H',$f3,'z',' →',0
  5768. Hz:        dc.b    $f3,'H',$f3,'z',0
  5769. adj_mes1:    dc.b    'Input the source frequency(Hz).',0    *31
  5770. adj_mes2:    dc.b    'Input the destination frequency(Hz).',0    *36
  5771. sure??:        dc.b    'Are you sure? (Y/N)',0
  5772. disk_md_mes:    dc.b    'DISK MODE',0
  5773. disk_md_mes2:    dc.b    'Select your job.',0    *16
  5774. dm_menu:    dc.b    '1)LOAD  2)SAVE  3)SAVE BY 4 PHASES  4)TEST PLAY',0
  5775. pcm_test:    dc.b    ' TEST PLAY ',0
  5776. load_md_mes_a:    dc.b    ' LOAD ADPCM DATA ',0
  5777. load_md_mes_p:    dc.b    ' LOAD PCM DATA ',0
  5778. save_md_mes_a:    dc.b    ' SAVE ADPCM DATA ',0
  5779. save_md_mes_p:    dc.b    ' SAVE PCM DATA ',0
  5780. save_4l_mes:    dc.b    ' SAVE BY 4 PHASES ',0
  5781. save_4l_mes2:    dc.b    'Select function.',0    *17
  5782. save_4l_menu:    dc.b    '1)save by 4 levels  2)save by 4 scales',0    *41
  5783. save_4l_menu2:    dc.b    '1)direction of minus  2)direction of plus',0
  5784. inpt_md_mes:    dc.b    'Input file name,or hit only CR to select from file menu.',0
  5785. fn_width:    dc.b    '['
  5786.         dcb.b    91,' '
  5787.         dc.b    ']',0
  5788. mem_er_mes:    dc.b    'OUT OF MEMORY',0
  5789. fop_er_mes:    dc.b    'FILE OPEN ERROR',0
  5790. rd_er_mes:    dc.b    'READ ERROR',0
  5791. wr_er_mes:    dc.b    'WRITE ERROR',0
  5792. dsk_f_mes:    dc.b    'DISK FULL',0
  5793. ast_mes:    dc.b    '****',0
  5794. cv_mes:        dc.b    ' PROCESSING… ',0
  5795. peak_mes:    dc.b    '  WAITING…  ',0
  5796. rc_mes:        dc.b    ' RECORDING… ',0
  5797. pl_mes:        dc.b    ' PLAYING… ',0
  5798. lvch_mes:    dc.b    'VOLUME CHANGE',0
  5799. lvch_mes2:    dc.b    'What percentage do you want to change in? (1%~300%)',0
  5800. _pcnt:    dc.b    '%',0
  5801. ptch_mes:    dc.b    'PITCH CHANGE',0
  5802. ptch_mes2:    dc.b    'How many keys do you want to shift? (-12~12)',0
  5803. _ksft:    dc.b    'half tone(s)',0
  5804. mix_mes:    dc.b    'COMPOUND',0
  5805. mix_mes2:    dc.b    'Decide the direction.',0
  5806. copy_mes3:    dc.b    '1)A → B  2)A ← B',0
  5807. ins_mes:    dc.b    ' INSERT ',0
  5808. *atob:    dc.b    'A→B',0
  5809. *btoa:    dc.b    'B→A',0
  5810. mix_mes4:    dc.b    'Offset count(s)=',0
  5811. minus_mes:    dc.b    'OPERATOR CALCULATION',0
  5812. minus_mes1:    dc.b    'Select the operator.',0
  5813. minus_mes2:    dc.b    '1)ADD 2)SUB 3)OR 4)AND 5)EOR',0
  5814. mix_mes3:
  5815. minus_mes3:    dc.b    '1)A + B → B  2)B + A → A    ',0
  5816.         dc.b    '1)A - B → B  2)B - A → A    ',0
  5817.         dc.b    '1)A or B → B  2)B or A → A  ',0
  5818.         dc.b    '1)A and B → B  2)B and A → A',0
  5819.         dc.b    '1)A eor B → B  2)B eor A → A',0
  5820. convol_mes:    dc.b    'CONVOLUTION',0
  5821. convol_mes3:    dc.b    '1)A * B → B  2)A * B → A',0
  5822. deconvol_mes:    dc.b    'DECONVOLUTION',0
  5823. deconvol_mes3:    dc.b    '1)B / A → B  2)A / B → A',0
  5824. cpd_mes:    dc.b    'DATA COPY',0
  5825. i_adpcmadr:    dc.b    'ADPCM DATA ADDRESS:',0
  5826. i_pcmadr:    dc.b    '   PCM DATA ADDRESS:',0
  5827. i_size:        dc.b    '   ADPCM DATA SIZE:',0
  5828. i_efsz:        dc.b    'EFFECTIVE DATA SIZE:',0
  5829. i_start:    dc.b    '       START POINT:',0
  5830. i_end:        dc.b    '          END POINT:',0
  5831. max_free:    dc.b    'FREE AREA:',0
  5832. kakko:        dc.b    '(        )',0
  5833. efct_mes:    dc.b    'EFFECTS SOUND',0
  5834. efct_mes2:    dc.b    '1)↑/↓  2)←/→  3)ADD 0 TO TAIL  4)REVERSE  5)CHORUS  6)DELAY  7)SFX  8)SMOOTHING  9)ENVELOPE',0
  5835. up_down_mes:    dc.b    'UP DOWN SHIFT',0
  5836. l_r_mes:    dc.b    'LEFT RIGHT SHIFT',0
  5837. ad_mes:        dc.b    "ADD '0' TO TAIL",0
  5838. env_mes:    dc.b    'CHANGE AN ENVELOPE',0
  5839. howmany0:    dc.b    'How many 0s do you want to add?',0
  5840. up_down_mes2:    dc.b    'Input offset value:',0
  5841. inout_mes:    dc.b    'Input in/out level:',0
  5842. sel_mode_mes:    dc.b    'Decide the mode(1.<  2.>):',0
  5843. title:        dc.b    $1b,'[36mΖ',$1b,'[35mvт.х ',$1b,'[37m'
  5844.         dc.b    $F3,'V',$F3,'E',$F3,'R',$F3,'S',$F3,'I',$F3,'O',$F3,'N'
  5845.         dc.b    $f3,' ',$f3,'2',$f3,'.',$f3,'0',$f3,'9'
  5846. author:
  5847.         dc.b    $1b,'[m (C) 1991,1992,1993,1994 '
  5848.         dc.b    $1b,'[36mZENJI SOFT',$1b,'[m',13,10,0
  5849. hlp_mes:    dc.b    $1b,'[37m< USAGE >',$1b,'[m ZVT.X [-・/options...] [file name1] [file name2] [file name3]',13,10
  5850.         dc.b    $1b,'[37m< OPTION LIST >',13,10,$1b,'[m'
  5851.         dc.b    '-?                   Display the option list.',13,10
  5852.         dc.b    '-4<P or V>[+ or -]   Change the pitch or the volume of FILE1 by 4 phases.',13,10
  5853.         dc.b    '-A                   Convert 16bit PCM data into ADPCM data.',13,10
  5854.         dc.b    '-C                   Convert ADPCM data into 16bit PCM data.',13,10
  5855.         dc.b    '-G                   Work at VISUAL MODE by force.',13,10
  5856.         dc.b    '-I[offset value]     Insert FILE1 into FILE2, save for FILE3.',13,10
  5857.         dc.b    "-M[offset value]     Mix FILE1 and FILE2, save for FILE3.",13,10
  5858.         dc.b    '-P[+ or -]<0≦n≦12> Change the pitch of FILE1, and save for FILE2.',13,10
  5859.         dc.b    '-V<1%≦n%≦300%>     Change the volume of FILE1, and save for FILE2.',13,10
  5860.         dc.b    $1b,'[37m< NOTICE >',13,10
  5861.         dc.b    "・You can put '-P' and '-V' at any case.",13,10
  5862.         dc.b    '・You can put wild cards on file names.',13,10
  5863.         dc.b    $1b,'[m',0
  5864. fn_er_mes:    dc.b    $1b,'[47mDid you set parameters properly?',$1b,'[m',13,10,0
  5865. outm_er_mes:    dc.b    $1b,'[47mOut of memory.',$1b,'[m',13,10,0
  5866. done_it:    dc.b    'Operations are all set.',13,10
  5867.         dc.b    'A ',$1b,'[37m','♪SOUND',$1b,'[m mind in a '
  5868.         dc.b    $1b,'[37mSOUND',$1b,'[m',' body.',13,10,0
  5869. rer_mes:    dc.b    $1b,'[47mFile read error.',$1b,'[m',13,10,0
  5870. fop_mes:    dc.b    $1b,'[47mFile open error.',$1b,'[m',13,10,0
  5871. wer_mes:    dc.b    $1b,'[47mFile write error.',$1b,'[m',13,10,0
  5872. dkf_mes:    dc.b    $1b,'[47mDisk is full up.',$1b,'[m',13,10,0
  5873. ger_mes:    dc.b    $1b,'[47mG-RAM is unable to use.',$1b,'[m',13,10,0
  5874. proc_mes:    dc.b    $1b,'[46mPROCESSING...',$1b,'[m',13,10,0
  5875. input_fn2_mes:    dc.b    'Input file name:',0
  5876. monitor_mode:    dc.b    0    *off
  5877. data_type:    dc.b    0    *pcm=0(adpcm=1)
  5878. sampling_rate:    dc.b    4    *15kHz
  5879. out_assign:    dc.b    3    *middle
  5880. trigger:    dc.b    0    *off
  5881. vol_tbl_down:    dc.b    60,76,88
  5882. vol_tbl_up:    dc.b    114,126,140
  5883. conv_atop_cmd:    dc.b    0
  5884. conv_ptoa_cmd:    dc.b    0
  5885. mix_cmd:    dc.b    0
  5886. _4_cmd:        dc.b    0
  5887. wild_mode:    dc.b    0
  5888. files_hjm:    dc.b    0
  5889. hk_mode:    dc.b    $ff
  5890. no_files:    dc.b    0
  5891. _L00009b:
  5892.     .dc.b    $1b,'[>1l',$00
  5893. _L0000a1:
  5894.     .dc.b    $1b,'[m',$00,$00
  5895. nameptr:
  5896.     dc.b    '*.*',0
  5897. ofsbar:    dc.b    '[     :          ] [     :          ] [         :          ]',0
  5898. stp0:    dc.b    'START',0
  5899. stp1:    dc.b    'POINT',0
  5900. edp0:    dc.b    '  END',0
  5901. edp1:    dc.b    'POINT',0
  5902. efsz0:    dc.b    'EFFECTIVE',0
  5903. efsz1:    dc.b    '     SIZE',0
  5904.     .even
  5905. scaleval:
  5906.     dc.w     16,17,19,21,23,25,28
  5907.     dc.w     31,34,37,41,45,50,55
  5908.     dc.w     60,66,73,80,88,97,107
  5909.     dc.w     118,130,143,157,173,190,209
  5910.     dc.w     230,253,279,307,337,371,408
  5911.     dc.w     449,494,544,598,658,724,796
  5912.     dc.w     876,963,1060,1166,1282,1411,1552
  5913. levelchg:
  5914.     dc.w    -1,-1,-1,-1,2,4,6,8
  5915.     dc.w    -1,-1,-1,-1,2,4,6,8
  5916. frq_tbl:*    case:pitch up
  5917.     *    for a=1 to 12
  5918.     *      frq_tbl=(2^-(a/12))*65536
  5919.     *    next
  5920.     dc.w    61858
  5921.     dc.w    58386
  5922.     dc.w    55109
  5923.     dc.w    52016
  5924.     dc.w    49097
  5925.     dc.w    46341
  5926.     dc.w    43740
  5927.     dc.w    41285
  5928.     dc.w    38968
  5929.     dc.w    36781
  5930.     dc.w    34716
  5931.     dc.w    32768
  5932. frq_tbl2:*    case:pith down
  5933.     *    for a=12 to 1 step -1
  5934.     *      frq_tbl=(2^(a/12))*65536-65536
  5935.     *    next
  5936.     dc.w    0
  5937.     dc.w    58179
  5938.     dc.w    51236
  5939.     dc.w    44682
  5940.     dc.w    38496
  5941.     dc.w    32657
  5942.     dc.w    27146
  5943.     dc.w    21944
  5944.     dc.w    17034
  5945.     dc.w    12400
  5946.     dc.w    8026
  5947.     dc.w    3897
  5948. scl_tbl_down:    dc.w    3897,8026,12400
  5949. scl_tbl_up:    dc.w    61858,58386,55109
  5950.  
  5951. sel_pnt:    dc.l    0    *!!!
  5952. oya_kai:    dc.l    0    *!!!
  5953.  
  5954. line_buf:
  5955. last_x:    ds.w    1
  5956. last_y:    ds.w    1
  5957.     ds.w    2
  5958.     dc.w    15    *color
  5959.     dc.w    $ffff    *line style
  5960. kakomi1:
  5961.     dc.w    0
  5962.     dc.w    0
  5963.     dc.w    767
  5964.     dc.w    scr_wy*2
  5965.     dc.w    1
  5966.     dc.w    %11001100_11001100
  5967. sen_1:
  5968.     dc.w    0
  5969.     dc.w    scr_wy
  5970.     dc.w    767
  5971.     dc.w    scr_wy
  5972.     dc.w    1
  5973.     dc.w    %11001100_11001100
  5974. kakomi2:
  5975.     dc.w    0
  5976.     dc.w    plus_
  5977.     dc.w    767
  5978.     dc.w    scr_wy*2+plus_
  5979.     dc.w    1
  5980.     dc.w    %11001100_11001100
  5981. sen_2:
  5982.     dc.w    0
  5983.     dc.w    scr_wy+plus_
  5984.     dc.w    767
  5985.     dc.w    scr_wy+plus_
  5986.     dc.w    1
  5987.     dc.w    %11001100_11001100
  5988.  
  5989. rate_tbl:
  5990.     dc.w    3900,5200,7800,10400,15600
  5991.  
  5992. exp_tbl:
  5993.     dc.l    1000000000
  5994.     dc.l    100000000
  5995.     dc.l    10000000
  5996.     dc.l    1000000
  5997.     dc.l    100000
  5998.     dc.l    10000
  5999.     dc.l    1000
  6000.     dc.l    100
  6001.     dc.l    10
  6002.     dc.l    1
  6003.  
  6004. sankaku:        *赤い三角形のカーソルのパターン
  6005.     dc.w    16,16
  6006.     dc.w    %00011000
  6007.     dc.w    %00011000
  6008.     dc.w    %00011000
  6009.     dc.w    %00011000
  6010.     dc.w    %00111100
  6011.     dc.w    %00111100
  6012.     dc.w    %00111100
  6013.     dc.w    %00111100
  6014.     dc.w    %01111110
  6015.     dc.w    %01111110
  6016.     dc.w    %01111110
  6017.     dc.w    %01111110
  6018.     dc.w    %00000000
  6019.     dc.w    %00000000
  6020.     dc.w    %00000000
  6021.     dc.w    %00000000
  6022.  
  6023. last_txt_adas:    dc.l    0
  6024. last_txt_adbs:    dc.l    0
  6025. last_txt_adae:    dc.l    0
  6026. last_txt_adbe:    dc.l    0
  6027.  
  6028. fnbfsz:        dc.l    $8000
  6029. truncate_cmd:    dc.l    0
  6030.  
  6031. pitch_cmd:    dc.b    0,0
  6032. volume_cmd:    dc.w    0,0
  6033. drive_name:    dcb.b    4,0
  6034.  
  6035. disk_mode:                *ディスクモード
  6036.     clr.b    use_fm
  6037.     movem.l    d0-d7/a0-a6,reg_buff2
  6038.     bsr    clr_bottom
  6039.     display2    disk_md_mes,%1111,0,28,9
  6040.     display2    disk_md_mes2,%0111,0,29,16
  6041.     display2    dm_menu,%0111,0,30,47
  6042.     moveq.l    #16,d1
  6043.     moveq.l    #29,d2
  6044.     IOCS    _B_LOCATE
  6045.     IOCS    _OS_CURON
  6046.     DOS    _INKEY
  6047.  
  6048.     move.b    d0,d1
  6049.     andi.b    #$DF,d1
  6050.     cmpi.b    #'L',d1
  6051.     beq    load_mode
  6052.     cmpi.b    #'S',d1
  6053.     beq    save_mode
  6054.     cmpi.b    #'T',d1
  6055.     beq    test_mode
  6056.  
  6057.     cmpi.b    #'1',d0
  6058.     beq    load_mode
  6059.     cmpi.b    #'2',d0
  6060.     beq    save_mode
  6061.     cmpi.b    #'3',d0
  6062.     beq    save_4levels
  6063.     cmpi.b    #'4',d0
  6064.     beq    test_mode
  6065.     bra    non_ope
  6066. main_scr:            *ファイルメニューから帰還した場合
  6067.     bsr    g_recover
  6068.     bsr    zen_clr        *全画面クリア
  6069.     bsr    scr_init
  6070.     movem.l    reg_buff2,d0-d7/a0-a6
  6071.     bra    complete
  6072.  
  6073. g_recover:
  6074.     moveq.l    #0,d1
  6075.     moveq.l    #0,d2
  6076.     move.w    #0,d3
  6077.     IOCS    _HOME        *gram疑似復活
  6078.     rts
  6079.  
  6080. g_giji_clr:
  6081.     moveq.l    #0,d1
  6082.     moveq.l    #0,d2
  6083.     move.w    #512,d3
  6084.     IOCS    _HOME        *gram疑似消去
  6085.     rts
  6086.  
  6087. save_4levels:            *4段階のデータをセーブする
  6088.     * X work3
  6089.     move.b    data_a(pc),d0
  6090.     or.b    data_b(pc),d0
  6091.     beq    non_ope        *データはない
  6092.     bsr    clr_bottom
  6093.     bsr    get_pt1
  6094.     display2    save_4l_mes+1,%1111,0,28,16
  6095.     display2    save_4l_mes2,%0111,0,29,16
  6096.     display2    save_4l_menu,%0111,0,30,41
  6097.     moveq.l    #16,d1
  6098.     moveq.l    #29,d2
  6099.     IOCS    _B_LOCATE
  6100.     DOS    _INKEY
  6101.     moveq.l    #0,d6
  6102.     cmpi.b    #'1',d0
  6103.     beq    sv4l_0
  6104.     addq.b    #1,d6        *memorize the function
  6105.     cmpi.b    #'2',d0
  6106.     bne    ext_sv4l
  6107. sv4l_0:
  6108.     moveq.l    #0,d1
  6109.     moveq.l    #29,d2
  6110.     IOCS    _B_LOCATE
  6111.     IOCS    _B_CLR_ST
  6112.     display2    mix_mes2,%0111,0,29,22
  6113.     display2    save_4l_menu2,%0111,0,30,44
  6114.     moveq.l    #22,d1
  6115.     moveq.l    #29,d2
  6116.     IOCS    _B_LOCATE
  6117.     DOS    _INKEY
  6118.     cmpi.b    #'1',d0
  6119.     sne    dirofchg    *memorize the direction 0=1(minus) ff=2(plus)
  6120.     beq    sv4l_1
  6121.     cmpi.b    #'2',d0
  6122.     bne    ext_sv4l
  6123. sv4l_1:
  6124.     lea    save_4l_mes(pc),a0    *後でファイルセレクトの時に最上部に表示
  6125.     moveq.l    #0,d1
  6126.     bsr    input_fn
  6127.     move.l    a1,d0
  6128.     beq    exit_sv_md
  6129.     move.l    a1,fn_adr
  6130.     bsr    dsp_cv_mes
  6131.  
  6132.     lea    address1(pc),a6
  6133.     tst.b    bank_sel
  6134.     beq    by4l0
  6135.  
  6136.     tst.b    data_b        *bank_b??
  6137.     beq    ext_by4l    *dataが無いなら…
  6138.     lea    20(a6),a6        *bank_b base addr.
  6139.     bra    by4l1
  6140. by4l0:
  6141.     tst.b    data_a        *bank_a??
  6142.     beq    ext_by4l    *dataが無いなら…
  6143. by4l1:
  6144.     tst.b    data_type
  6145.     beq    copy_pcmdt    *data modeがpcmならpcm dataはあるから…
  6146.                 *data modeがadpcmの時…
  6147.     tst.l    pbuffer(a6)
  6148.     bne    copy_pcmdt2    *pcm dataもあるなら…(data typeはadpcm)
  6149.  
  6150.     move.l    psize(a6),d2
  6151.     lsl.l    #2,d2        *d2=pcm data size for work
  6152.     move.l    d2,-(sp)    *work用のバッファを確保
  6153.     DOS    _MALLOC
  6154.     addq.w    #4,sp
  6155.     move.l    d0,mm_error
  6156.     bsr    print_em
  6157.     bmi    ext_by4l
  6158.     move.l    d0,work3
  6159.     move.l    d0,a1            *a1=destination
  6160.     move.l    paddress(a6),a0        *a0=source
  6161.     move.l    psize(a6),d0
  6162.     movem.l    d6/a1/a6,-(sp)
  6163.     bsr    just_adpcm_to_pcm    *adpcm -> pcm
  6164.     movem.l    (sp)+,d6/a1/a6
  6165.     move.l    pstart(a6),d0
  6166.     sub.l    paddress(a6),d0
  6167.     lsl.l    #2,d0
  6168.     adda.l    d0,a1
  6169.     move.l    a1,buffer3
  6170.     move.l    pend(a6),d0
  6171.     sub.l    pstart(a6),d0
  6172.     addq.l    #1,d0
  6173.     move.l    d0,size3
  6174.     bra    do_by4l
  6175. copy_pcmdt:            *data mode is pcm
  6176.     move.l    pstart(a6),a1
  6177.     move.l    pend(a6),d2
  6178.     sub.l    a1,d2
  6179.     addq.l    #2,d2        *pcm data size
  6180.     move.l    d2,d0
  6181.     lsr.l    #2,d0
  6182.     move.l    d0,size3    *=adpcm data size
  6183.     bra    do_copy_pcmdt
  6184. copy_pcmdt2:            *data mode is adpcm
  6185.     move.l    pstart(a6),d0
  6186.     sub.l    paddress(a6),d0
  6187.     lsl.l    #2,d0
  6188.     move.l    pbuffer(a6),a1
  6189.     adda.l    d0,a1        *a1=source
  6190.     move.l    pend(a6),d2
  6191.     sub.l    pstart(a6),d2
  6192.     addq.l    #1,d2
  6193.     move.l    d2,size3    *=adpcm data size
  6194.     lsl.l    #2,d2        *d2=pcm data size
  6195. do_copy_pcmdt:
  6196.     move.l    d2,-(sp)    *get pcm work area
  6197.     DOS    _MALLOC
  6198.     addq.w    #4,sp
  6199.     move.l    d0,mm_error
  6200.     bsr    print_em
  6201.     bmi    ext_by4l
  6202.     move.l    d0,work3    *後でmfree
  6203.     move.l    d0,a2        *destination
  6204.     move.l    d0,buffer3
  6205.     moveq.l    #5,d1        *trans mode
  6206.     bsr    trans_dma
  6207. do_by4l:
  6208.     pea    modosu_sv4l(pc)    *push retuen adr
  6209.     tst.b    d6
  6210.     beq    by4levels
  6211.     bra    by4scales
  6212.  
  6213. modosu_sv4l:
  6214.     move.l    work3(pc),-(sp)
  6215.     DOS    _MFREE
  6216.     addq.w    #4,sp
  6217. ext_sv4l:
  6218.     bsr    put_pt1
  6219.     tst.b    use_fm
  6220.     bne    main_scr
  6221.     bra    non_ope
  6222.  
  6223. by4levels:            *4段階のボリュームでセーブ
  6224.     * < size3,buffer3
  6225.     * < (fn_adr)=file name adr
  6226.  
  6227.     movem.l    d0-d7/a0-a6,reg_buff3
  6228.     move.l    size3(pc),d2
  6229.     move.l    d2,-(sp)    *work用のバッファを確保
  6230.     DOS    _MALLOC
  6231.     addq.w    #4,sp
  6232.     move.l    d0,mm_error
  6233.     bsr    print_em
  6234.     bmi    ext_by4l_
  6235.     move.l    d0,address3    *save work address
  6236.     move.l    d0,a0        *destination
  6237.     move.l    buffer3(pc),a1    *source
  6238.     move.l    size3(pc),d0    *size
  6239.     bsr    pcm_to_adpcm    *adpcmデータへ変換
  6240.     move.b    #'4',fn_sj
  6241.     bsr    make_file_name
  6242.     move.l    fn_adr(pc),a1    *file name adr
  6243.     move.l    address3(pc),a2    *data adr
  6244.     move.l    size3(pc),d1    *d1=size
  6245.     bsr    write_data    *基本データをまずセーブ
  6246.     bsr    print_em
  6247.     bmi    ext_by4l    *case error
  6248.  
  6249.     tst.b    dirofchg
  6250.     bne    dir_up
  6251.     lea    vol_tbl_down(pc),a3    *case down
  6252.     bra    by4l_start
  6253. dir_up:                *case up
  6254.     lea    vol_tbl_up(pc),a3
  6255. by4l_start:            *4段階のボリューム値でセーブ
  6256.     moveq.l    #3-1,d7        *loop counter
  6257.     move.b     #'3',fn_sj
  6258. by4l_lp:
  6259.     movem.l    d7/a3,-(sp)    *push counter
  6260.  
  6261.     move.l    buffer3(pc),a1
  6262.     move.l    size3(pc),d0
  6263.     add.l    d0,d0        *d0=pcm data count
  6264.     move.b    (a3,d7.w),d6
  6265.     bsr    do_level    *ボリューム変更処理へ
  6266.  
  6267.     move.l    buffer3(pc),a1
  6268.     move.l    address3(pc),a0
  6269.     move.l    size3(pc),d0
  6270.     bsr    pcm_to_adpcm    *adpcmデータへ変換
  6271.  
  6272.     movem.l    (sp)+,d7/a3
  6273.  
  6274.     bsr    make_file_name
  6275.     move.l    fn_adr(pc),a1    *file name adr
  6276.     move.l    address3(pc),a2    *data adr
  6277.     move.l    size3(pc),d1    *d1=size
  6278.     bsr    write_data
  6279.     bsr    print_em
  6280.     bmi    ext_by4l    *case error
  6281.  
  6282.     subq.b    #1,fn_sj
  6283.     dbra    d7,by4l_lp
  6284. ext_by4l:
  6285.     move.l    address3(pc),-(sp)
  6286.     DOS    _MFREE
  6287.     addq.w    #4,sp
  6288. ext_by4l_:
  6289.     movem.l    reg_buff3(pc),d0-d7/a0-a6
  6290.     rts
  6291.  
  6292. by4scales:            *4段階のスケールでセーブ
  6293.     * < size3,buffer3
  6294.     * < (fn_adr)=file name adr
  6295.  
  6296.     movem.l    d0-d7/a0-a6,reg_buff3
  6297.     move.l    size3(pc),d2
  6298.     not.b    dirofchg
  6299.     beq    get_memwk
  6300.     move.l    d2,d0
  6301.     lsr.l    d0
  6302.     add.l    d0,d2        *1.5倍取る
  6303. get_memwk:
  6304.     move.l    d2,-(sp)    *work用のバッファを確保
  6305.     DOS    _MALLOC
  6306.     addq.w    #4,sp
  6307.     move.l    d0,mm_error
  6308.     bsr    print_em
  6309.     bmi    ext_by4l_
  6310.     move.l    d0,address3    *save work address
  6311.  
  6312.     add.l    d2,d2
  6313.     move.l    d2,d0
  6314.     add.l    d2,d2        *d2=pcm data size
  6315.     tst.b    dirofchg
  6316.     beq    get_memwk_
  6317.     add.l    d0,d2        *pcm dataの1.5倍取る
  6318. get_memwk_:
  6319.     move.l    d2,-(sp)
  6320.     DOS    _MALLOC
  6321.     addq.w    #4,sp
  6322.     move.l    d0,mm_error
  6323.     bsr    print_em
  6324.     bmi    ext_by4l
  6325.     move.l    d0,work2    *pitchを変更したPCMデータの格納位置
  6326.  
  6327.     move.l    size3(pc),d0    *size
  6328.     move.l    buffer3(pc),a1    *source
  6329.     move.l    address3(pc),a0    *destination
  6330.     bsr    pcm_to_adpcm    *adpcmデータへ変換
  6331.     move.b    #'4',fn_sj
  6332.     bsr    make_file_name
  6333.     move.l    fn_adr(pc),a1    *file name adr
  6334.     move.l    address3(pc),a2    *data adr
  6335.     move.l    size3(pc),d1    *d1=size
  6336.     bsr    write_data    *基本データをまずセーブ
  6337.     bsr    print_em
  6338.     bmi    ext_by4s    *case error
  6339.  
  6340.     move.b    dirofchg(pc),d6
  6341.     beq    dir_up_sc    *-1=pitch down,0=pitch up
  6342.     lea    scl_tbl_down(pc),a3    *case down
  6343.     bra    by4s_start
  6344. dir_up_sc:            *case up
  6345.     lea    scl_tbl_up(pc),a3
  6346. by4s_start:            *4段階のボリューム値でセーブ
  6347.     moveq.l    #3-1,d7        *loop counter
  6348.     move.b     #'3',fn_sj
  6349. by4s_lp:
  6350.     move.l    buffer3(pc),a2    *source pcm addr.
  6351.     move.l    work2(pc),a1    *destination pcm addr.
  6352.     move.l    size3(pc),d0
  6353.     add.l    d0,d0        *d0=pcm data count
  6354.     move.w    (a3)+,d4    *d4=parameter (d6は頭で設定済み)
  6355.     bsr    do_pitch    *ボリューム変更処理へ
  6356.  
  6357.     move.l    a1,d0
  6358.     lsr.l    #2,d0        *size of source pcm data
  6359.     movem.l    d0/d6-d7/a3,-(sp)    *push counter
  6360.     move.l    work2(pc),a1    *source
  6361.     move.l    address3(pc),a0    *destination
  6362.     bsr    pcm_to_adpcm    *adpcmデータへ変換
  6363.     movem.l    (sp)+,d0/d6-d7/a3
  6364.  
  6365.     bsr    make_file_name
  6366.     move.l    fn_adr(pc),a1    *file name adr
  6367.     move.l    address3(pc),a2    *data adr
  6368.     move.l    d0,d1        *d1=size
  6369.     bsr    write_data
  6370.     bsr    print_em
  6371.     bmi    ext_by4s    *case error
  6372.  
  6373.     subq.b    #1,fn_sj
  6374.     dbra    d7,by4s_lp
  6375. ext_by4s:
  6376.     move.l    work2(pc),d0
  6377.     move.l    d0,-(sp)    *destination pcm data areaの開放
  6378.     DOS    _MFREE
  6379.     addq.w    #4,sp
  6380.     bra    ext_by4l
  6381.  
  6382. make_file_name:            *ファイルネームに数字を挿入
  6383.     * < fn_adr = file name adr.
  6384.     * < fn_sj  =数字
  6385.     * - all
  6386.     movem.l    d0-d1/a0,-(sp)
  6387.     movea.l    fn_adr(pc),a0
  6388.     moveq.l    #7,d1
  6389. mfn_lp:
  6390.     move.b    (a0)+,d0
  6391.     beq    mfn1        *0なら…
  6392.     cmpi.b    #'.',d0
  6393.     beq    mfn1
  6394.     dbra    d1,mfn_lp
  6395.     addq.w    #1,a0
  6396. mfn1:
  6397.     subq.w    #1,a0
  6398.     move.b    #'.',(a0)+
  6399.     move.b    fn_sj(pc),(a0)+    *set mark
  6400.     clr.b    (a0)+        *set end mark
  6401.     movem.l    (sp)+,d0-d1/a0
  6402.     rts
  6403.  
  6404. save_mode:
  6405.     move.b    data_type(pc),dt_mem    *保存
  6406.     lea    param_mem(pc),a1
  6407.     move.l    start_point1(pc),(a1)+
  6408.     move.l    end_point1(pc),(a1)+
  6409.     move.l    start_point2(pc),(a1)+
  6410.     move.l    end_point2(pc),(a1)+
  6411.     move.b    data_a(pc),d0
  6412.     or.b    data_b(pc),d0
  6413.     beq    non_ope        *データはない
  6414.     bsr    clr_bottom
  6415.     lea    save_md_mes_p(pc),a0    *後でファイルセレクトの時に最上部に表示
  6416.     moveq.l    #13-1,d4
  6417.     tst.b    data_type
  6418.     beq    @f
  6419.     lea    save_md_mes_a(pc),a0    *後でファイルセレクトの時に最上部に表示
  6420.     moveq.l    #15-1,d4
  6421. @@:
  6422.     lea.l    1(a0),a1
  6423.     moveq.l    #%1111,d1
  6424.     moveq.l    #0,d2
  6425.     moveq.l    #28,d3
  6426.     IOCS    _B_PUTMES
  6427.     moveq.l    #1,d1
  6428.     bsr    input_fn
  6429.     cmpa.l    #0,a1
  6430.     beq    exit_sv_md
  6431.  
  6432.     bsr    ext_chk
  6433.  
  6434.     lea    address1(pc),a0
  6435.     tst.b    bank_sel
  6436.     beq    sv1
  6437.     lea    20(a0),a0
  6438.     tst.b    data_b
  6439.     beq    exit_sv_md
  6440.     bra    sv11
  6441. sv1:
  6442.     tst.b    data_a
  6443.     beq    exit_sv_md
  6444. sv11:                *a0=base address
  6445.     move.l    pend(a0),d1
  6446.     move.l    pstart(a0),a2
  6447.     sub.l    a2,d1        *get size
  6448.     move.b    dt_mem(pc),d0
  6449.     cmp.b    data_type(pc),d0
  6450.     beq    @f
  6451.     bsr    modechg_sv
  6452.     move.l    pend(a0),d1
  6453.     move.l    pstart(a0),a2
  6454.     sub.l    a2,d1        *get size
  6455.     addq.l    #1,d1
  6456.     tst.b    data_type
  6457.     bne    dosvwr
  6458.     addq.l    #3,d1
  6459.     bra    dosvwr
  6460. @@:
  6461.     addq.l    #1,d1
  6462.     tst.b    data_type
  6463.     bne    dosvwr
  6464.     addq.l    #1,d1
  6465. dosvwr:
  6466.     bsr    write_data    *d1=size,a2=addr,a1=filename
  6467.     bsr    print_em
  6468.     bmi    exit_sv_md    *case error
  6469. exit_sv_md:
  6470.     move.b    dt_mem(pc),data_type
  6471.     lea    param_mem(pc),a1
  6472.     move.l    (a1)+,start_point1
  6473.     move.l    (a1)+,end_point1
  6474.     move.l    (a1)+,start_point2
  6475.     move.l    (a1)+,end_point2
  6476.     tst.b    use_fm
  6477.     bne    main_scr
  6478.     bra    non_ope
  6479.  
  6480. ext_chk:            *拡張子のチェック
  6481.     * X d0.l
  6482.     pea    (a1)
  6483. @@:
  6484.     move.b    (a1)+,d0
  6485.     beq    @f
  6486.     cmpi.b    #'.',d0
  6487.     bne    @b
  6488.     move.b    (a1)+,d0
  6489.     bsr    mk_capital0
  6490.     cmpi.b    #'P',d0
  6491.     bne    @f
  6492.     move.b    (a1)+,d0
  6493.     bsr    mk_capital0
  6494.     cmpi.b    #'C',d0
  6495.     bne    sv_p16?
  6496.     move.b    (a1)+,d0
  6497.     bsr    mk_capital0
  6498.     cmpi.b    #'M',d0
  6499.     bne    @f
  6500.     st.b    data_type
  6501.     bra    @f
  6502. sv_p16?:
  6503.     cmpi.b    #'1',d0
  6504.     bne    @f
  6505.     move.b    (a1)+,d0
  6506.     cmpi.b    #'6',d0
  6507.     bne    @f
  6508.     clr.b    data_type
  6509. @@:
  6510.     move.l    (sp)+,a1
  6511.     rts
  6512.  
  6513. modechg_sv:
  6514.     tst.b    bank_sel
  6515.     bne    modechg_ldb
  6516.     bra    modechg_lda
  6517.  
  6518. load_mode:
  6519.     bsr    clr_bottom
  6520.     lea    load_md_mes_p(pc),a0    *後でファイルセレクトの時に最上部に表示
  6521.     moveq.l    #13-1,d4
  6522.     move.b    data_type(pc),dt_mem
  6523.     beq    @f
  6524.     lea    load_md_mes_a(pc),a0    *後でファイルセレクトの時に最上部に表示
  6525.     moveq.l    #15-1,d4
  6526. @@:
  6527.     lea.l    1(a0),a1
  6528.     moveq.l    #%1111,d1
  6529.     moveq.l    #0,d2
  6530.     moveq.l    #28,d3
  6531.     IOCS    _B_PUTMES
  6532.     moveq.l    #0,d1
  6533.     bsr    input_fn
  6534.     cmpa.l    #0,a1
  6535.     beq    exit_ld_md
  6536.     tst.b    bank_sel    *which bank?
  6537.     bne    case_bank_b
  6538. *case_bank_a:                *bank_aの場合
  6539.     bsr    open_check
  6540.     bsr    print_em
  6541.     bmi    exit_ld_md    *case error
  6542.  
  6543.     move.l    a1,-(sp)
  6544.     move.l    a1,-(sp)
  6545.  
  6546.     clr.b    data_a
  6547.     bsr    mfree_adpcm_a
  6548.     bsr    mfree_pcm_a
  6549.     bsr    waku1        *!!
  6550.     move.l    (sp)+,a1
  6551.     lea    bank_a_fn(pc),a0
  6552.     move.b    #' ',(a0)+
  6553. stfna_lp:
  6554.     move.b    (a1)+,d0
  6555.     move.b    d0,(a0)+
  6556.     beq    @f
  6557.     cmpi.b    #'.',d0
  6558.     bne    stfna_lp
  6559.     move.l    a0,a2
  6560.     bra    stfna_lp
  6561. @@:
  6562.     move.l    (sp)+,a1
  6563.                 *read data to BANK A
  6564.     bsr    read_data    *d1=size,d2=addr.
  6565.     bsr    print_em
  6566.     bmi    exit_ld_md    *case error
  6567.     move.b    (a2)+,d0
  6568.     bsr    mk_capital0
  6569.     cmpi.b    #'P',d0
  6570.     bne    @f
  6571.     move.b    (a2)+,d0
  6572.     bsr    mk_capital0
  6573.     cmpi.b    #'C',d0
  6574.     bne    a_p16?
  6575.     move.b    (a2)+,d0
  6576.     bsr    mk_capital0
  6577.     cmpi.b    #'M',d0
  6578.     bne    @f
  6579.     st.b    data_type
  6580.     bra    a_adpcm
  6581. a_p16?:
  6582.     cmpi.b    #'1',d0
  6583.     bne    @f
  6584.     move.b    (a2)+,d0
  6585.     cmpi.b    #'6',d0
  6586.     bne    @f
  6587.     clr.b    data_type
  6588.     bra    sv_buf1
  6589. @@:
  6590.     tst.b    data_type
  6591.     beq    sv_buf1
  6592. a_adpcm:
  6593.     move.l    d1,size1
  6594.     beq    exit_ld_md
  6595.     move.l    d2,address1    *読み込んだのはadpcm data
  6596.     st.b    data_type
  6597.     bsr    new_bank_a
  6598.     bra    exit_ld_md
  6599. sv_buf1:
  6600.     lsr.l    #2,d1        *pcmデータのサイズはadpcmのサイズに直す
  6601.     move.l    d1,size1
  6602.     beq    exit_ld_md
  6603.     move.l    d2,buffer1    *読み込んだのはpcm data
  6604.     clr.b    data_type
  6605.     bsr    new_bank_a
  6606.     bra    exit_ld_md
  6607.  
  6608. case_bank_b:            *bank_bの場合
  6609.     bsr    open_check
  6610.     bsr    print_em
  6611.     bmi    exit_ld_md    *case error
  6612.  
  6613.     move.l    a1,-(sp)
  6614.     move.l    a1,-(sp)
  6615.  
  6616.     clr.b    data_b
  6617.     bsr    mfree_adpcm_b
  6618.     bsr    mfree_pcm_b
  6619.     bsr    waku2        *!!
  6620.     move.l    (sp)+,a1
  6621.     lea    bank_b_fn(pc),a0
  6622.     move.b    #' ',(a0)+
  6623. stfnb_lp:
  6624.     move.b    (a1)+,d0
  6625.     move.b    d0,(a0)+
  6626.     beq    @f
  6627.     cmpi.b    #'.',d0
  6628.     bne    stfnb_lp
  6629.     move.l    a0,a2
  6630.     bra    stfnb_lp
  6631. @@:
  6632.     move.l    (sp)+,a1
  6633.                 *read data to BANK B
  6634.     bsr    read_data    *d1=size,d2=addr.
  6635.     bsr    print_em
  6636.     bmi    exit_ld_md    *case error
  6637.     move.b    (a2)+,d0
  6638.     bsr    mk_capital0
  6639.     cmpi.b    #'P',d0
  6640.     bne    @f
  6641.     move.b    (a2)+,d0
  6642.     bsr    mk_capital0
  6643.     cmpi.b    #'C',d0
  6644.     bne    b_p16?
  6645.     move.b    (a2)+,d0
  6646.     bsr    mk_capital0
  6647.     cmpi.b    #'M',d0
  6648.     bne    @f
  6649.     st.b    data_type
  6650.     bra    b_adpcm
  6651. b_p16?:
  6652.     cmpi.b    #'1',d0
  6653.     bne    @f
  6654.     move.b    (a2)+,d0
  6655.     cmpi.b    #'6',d0
  6656.     bne    @f
  6657.     clr.b    data_type
  6658.     bra    sv_buf2
  6659. @@:
  6660.     tst.b    data_type
  6661.     beq    sv_buf2
  6662. b_adpcm:
  6663.     move.l    d1,size2
  6664.     beq    exit_ld_md
  6665.     move.l    d2,address2
  6666.     st.b    data_type
  6667.     bsr    new_bank_b
  6668.     bra    exit_ld_md
  6669. sv_buf2:
  6670.     lsr.l    #2,d1
  6671.     move.l    d1,size2
  6672.     beq    exit_ld_md
  6673.     move.l    d2,buffer2
  6674.     clr.b    data_type
  6675.     bsr    new_bank_b
  6676. exit_ld_md:
  6677.     move.b    dt_mem(pc),d0
  6678.     cmp.b    data_type(pc),d0
  6679.     beq    @f
  6680.     bsr    modechg_lda
  6681.     bsr    modechg_ldb
  6682. @@:
  6683.     tst.b    use_fm
  6684.     bne    main_scr
  6685.     bra    non_ope
  6686.  
  6687. modechg_lda:
  6688.     tst.b    data_a
  6689.     beq    ext_chg_tp_        *データエリアに何もない…
  6690.     tst.b    data_type
  6691.     bne    ad_ready_a?_
  6692.     move.l    buffer1(pc),d0
  6693.     bne    @f            *pcmデータはある
  6694.     bsr    make_pcm_a
  6695.     bmi    @f            *case:error
  6696. *    movem.l    d0-d7/a0-a6,-(sp)
  6697. *    move.l    size1(pc),d6
  6698. *    movea.l    buffer1(pc),a6
  6699. *    move.w    #scr_wy,genten_y
  6700. *    bsr    waku1
  6701. *    bsr    dsp_wv
  6702. *    movem.l    (sp)+,d0-d7/a0-a6
  6703. @@:
  6704.     bra    calc_es_pcm_a
  6705. ad_ready_a?_:
  6706.     move.l    address1(pc),d0
  6707.     bne    @f            *両方あるよ
  6708.     bsr    make_adpcm_a
  6709. @@:
  6710.     bra    calc_es_adpcm_a
  6711. ext_chg_tp_:
  6712.     rts
  6713.  
  6714. modechg_ldb:
  6715.     tst.b    data_b
  6716.     beq    ext_chg_tp_        *データエリアに何もない…
  6717.     tst.b    data_type
  6718.     bne    ad_ready_b?_
  6719.     move.l    buffer2(pc),d0
  6720.     bne    @f            *pcmデータはある
  6721.     bsr    make_pcm_b
  6722.     bmi    @f            *case:error
  6723. *    movem.l    d0-d7/a0-a6,-(sp)
  6724. *    move.l    size2(pc),d6
  6725. *    movea.l    buffer2(pc),a6
  6726. *    move.w    #scr_wy+plus_,genten_y
  6727. *    bsr    waku2
  6728. *    bsr    dsp_wv
  6729. *    movem.l    (sp)+,d0-d7/a0-a6
  6730. @@:
  6731.     bra    calc_es_pcm_b
  6732. ad_ready_b?_:
  6733.     move.l    address2(pc),d0
  6734.     bne    @f            *両方あるよ
  6735.     bsr    make_adpcm_b
  6736. @@:
  6737.     bra    calc_es_adpcm_b
  6738.  
  6739. new_bank_a:        *BANK Aに新しいデータが入った時
  6740.     bsr    waku1
  6741.     clr.l    start_point1
  6742.     clr.l    end_point1
  6743.     st    data_a        *データ入りました…
  6744.  
  6745.     tst.b    data_type
  6746.     bne    do_dispwv_a_2    *読み込んだのがadpcmデータなら波形は表示しない
  6747.  
  6748. *    move.l    size1(pc),d1
  6749. *    lsl.l    #2,d1
  6750. *    move.l    d1,-(sp)
  6751. *    DOS    _MALLOC
  6752. *    addq.w    #4,sp
  6753. *    move.l    d0,mm_error
  6754. *    bsr    print_em
  6755. *    beq    do_dispwv_a
  6756. *    bsr    mfree_adpcm_a    *エラーの場合
  6757. *    bsr    mfree_pcm_a
  6758. *    clr.b    data_a
  6759. *    rts
  6760. do_dispwv_a:
  6761.     movea.l    buffer1(pc),a6
  6762.     move.l    size1(pc),d6
  6763.     move.w    #85,genten_y
  6764.     bsr    dsp_wv
  6765.     bra    byebye_a
  6766. do_dispwv_a_2:
  6767.     movea.l    address1(pc),a6
  6768.     move.l    size1(pc),d6
  6769.     move.w    #85,genten_y
  6770.     bsr    dsp_wv_2
  6771. byebye_a:
  6772.     rts
  6773. new_bank_b:        *BANK Bに新しいデータが入った時
  6774.     bsr    waku2
  6775.     clr.l    start_point2
  6776.     clr.l    end_point2
  6777.     st    data_b        *データ入りました…
  6778.  
  6779.     tst.b    data_type
  6780.     bne    do_dispwv_b_2    *読み込んだのがadpcmデータなら波形は表示しない
  6781.  
  6782. *    move.l    size2(pc),d1
  6783. *    lsl.l    #2,d1
  6784. *    move.l    d1,-(sp)
  6785. *    DOS    _MALLOC
  6786. *    addq.w    #4,sp
  6787. *    move.l    d0,mm_error
  6788. *    bsr    print_em
  6789. *    beq    do_dispwv_b
  6790. *    bsr    mfree_adpcm_b    *エラーの場合
  6791. *    bsr    mfree_pcm_b
  6792. *    clr.b    data_b
  6793. *    rts
  6794. do_dispwv_b:
  6795.     movea.l    buffer2(pc),a6
  6796.     move.l    size2(pc),d6
  6797.     move.w    #scr_wy+plus_,genten_y
  6798.     bsr    dsp_wv
  6799.     bra    byebye_b
  6800. do_dispwv_b_2:
  6801.     movea.l    address2(pc),a6
  6802.     move.l    size2(pc),d6
  6803.     move.w    #scr_wy+plus_,genten_y
  6804.     bsr    dsp_wv_2
  6805. byebye_b:
  6806.     rts
  6807.  
  6808. mfree_adpcm_a:            *clear bank_a adpcm area
  6809.     move.l    address1(pc),d0
  6810.     beq    ext_maa
  6811.     move.l    d0,-(sp)
  6812.     DOS    _MFREE
  6813.     addq.w    #4,sp
  6814.     clr.l    address1
  6815. ext_maa:
  6816.     rts
  6817. mfree_adpcm_b:            *clear bank_b adpcm area
  6818.     move.l    address2(pc),d0
  6819.     beq    ext_mab
  6820.     move.l    d0,-(sp)
  6821.     DOS    _MFREE
  6822.     addq.w    #4,sp
  6823.     clr.l    address2
  6824. ext_mab:
  6825.     rts
  6826. mfree_pcm_a:            *clear bank_a pcm area
  6827.     move.l    buffer1(pc),d0
  6828.     beq    ext_mpa
  6829.     move.l    d0,-(sp)
  6830.     DOS    _MFREE
  6831.     addq.w    #4,sp
  6832.     clr.l    buffer1
  6833. ext_mpa:
  6834.     rts
  6835. mfree_pcm_b:            *clear bank_b pcm area
  6836.     move.l    buffer2(pc),d0
  6837.     beq    ext_mpb
  6838.     move.l    d0,-(sp)
  6839.     DOS    _MFREE
  6840.     addq.w    #4,sp
  6841.     clr.l    buffer2
  6842. ext_mpb:
  6843.     rts
  6844.  
  6845. input_fn:
  6846.     * < d1.l≠0 上書き確認必要
  6847.     * < d1.l=1 上書き確認なし
  6848.     * > use_fm=1 file menuを使った
  6849.     * > a1=file name addr.
  6850.     * > a1=0 then cansel
  6851.     move.l    d1,-(sp)
  6852.     clr.b    use_fm
  6853.     moveq.l    #0,d1
  6854.     moveq.l    #29,d2
  6855.     IOCS    _B_LOCATE
  6856.     IOCS    _B_CLR_ST
  6857.     display2    inpt_md_mes,%0111,0,29,60
  6858.     display2    fn_width,%0111,0,30,91+2
  6859.     moveq.l    #1,d1
  6860.     moveq.l    #30,d2
  6861.     IOCS    _B_LOCATE
  6862.     IOCS    _OS_CURON
  6863.  
  6864.     lea    input_buffer(pc),a1
  6865.     move.b    #91,(a1)    *文字数
  6866.     pea    (a1)
  6867.     DOS    _GETS        *一行入力
  6868.     addq.w    #4,sp
  6869.  
  6870.     addq.w    #2,a1        *chr data buffer
  6871.     IOCS    _OS_CUROF
  6872.  
  6873.     move.l    (sp)+,d1
  6874.     move.l    #nameptr,work3
  6875.     cmpi.b    #$20,(a1)
  6876.     bls    i_from_m
  6877.     move.l    a1,work3
  6878.     bsr    check_wild
  6879.     bmi    i_from_m
  6880.     tst.l    d1
  6881.     beq    exit_ifn
  6882.     bsr    open_check
  6883.     tst.l    fo_error
  6884.     bmi    exit_ifn    *file not exist case
  6885. *    bsr    clr_bottom
  6886.     movem.l    d1-d4/a1,-(sp)
  6887.     display2    sure??,%0111,0,29,19
  6888.     moveq.l    #19,d1
  6889.     moveq.l    #29,d2
  6890.     IOCS    _B_LOCATE
  6891.     moveq.l    #0,d1
  6892.     IOCS    _B_ERA_ST
  6893.     IOCS    _OS_CURON
  6894.     DOS    _INKEY
  6895.     movem.l    (sp)+,d1-d4/a1
  6896.     move.b    d0,d1
  6897.     bsr    mk_capital1
  6898.     cmpi.b    #'Y',d1
  6899.     beq    exit_ifn
  6900.     cmpi.b    #$0d,d0
  6901.     beq    exit_ifn
  6902.     suba.l    a1,a1
  6903. exit_ifn:
  6904.     rts
  6905.  
  6906. check_wild:            *ワイルドカードがあるか
  6907.     * > minus = wild / zero = not wild
  6908.     * - ALL
  6909.     movem.l    d0/a1,-(sp)
  6910. cw_lp:
  6911.     move.b    (a1)+,d0
  6912.     beq    bye_cw_no    *file name end
  6913. *    cmpi.b    #'\',d0
  6914. *    beq    mukou_cw
  6915.     cmpi.b    #'*',d0
  6916.     beq    bye_cw_yes
  6917.     cmpi.b    #'?',d0
  6918.     bne    cw_lp
  6919. bye_cw_yes:
  6920.     moveq.l    #-1,d0
  6921.     movem.l    (sp)+,d0/a1
  6922.     rts
  6923. bye_cw_no:
  6924.     moveq.l    #0,d0
  6925.     movem.l    (sp)+,d0/a1
  6926.     rts
  6927. mukou_cw:
  6928.     move.l    #nameptr,work3
  6929.     bra    bye_cw_yes
  6930.  
  6931. i_from_m:            *ファイルメニューよりファイル選択
  6932.     * < a0=mode mes
  6933.     movem.l    d0-d7/a2-a6,reg_buff3
  6934.     bsr    zen_clr
  6935.     move.l    a0,a1        *モード名の表示
  6936. @@:
  6937.     tst.b    (a0)+
  6938.     bne    @b
  6939.     move.l    a0,d4
  6940.     sub.l    a1,d4
  6941.     subq.w    #2,d4
  6942.     moveq.l    #%1101,d1
  6943.     moveq.l    #0,d2
  6944.     moveq.l    #0,d3
  6945.     IOCS    _B_PUTMES
  6946.     bsr    file_sel
  6947.     st    use_fm
  6948.     movem.l    reg_buff3(pc),d0-d7/a2-a6
  6949.     rts
  6950.  
  6951. data_clr:            *データのクリア
  6952.     movem.l    d0-d7/a0-a6,reg_buff2
  6953.     moveq.l    #0,d7
  6954.     lea    address1(pc),a0
  6955.     tst.b    bank_sel
  6956.     beq    dc1
  6957.     lea    20(a0),a0
  6958. dc1:
  6959.     bsr    clr_bottom
  6960.     display2    sure??,%0111,0,28,19
  6961.     moveq.l    #19,d1
  6962.     moveq.l    #28,d2
  6963.     IOCS    _B_LOCATE
  6964.     IOCS    _OS_CURON
  6965.     DOS    _INKEY
  6966.     move.b    d0,d1
  6967.     bsr    mk_capital1
  6968.     cmpi.b    #'Y',d1
  6969.     beq    do_clr
  6970.     cmpi.b    #$0d,d0
  6971.     beq    do_clr
  6972. ext_dc:
  6973.     IOCS    _OS_CUROF
  6974.     bsr    scr_init
  6975.     movem.l    reg_buff2(pc),d0-d7/a0-a6
  6976.     bra    complete
  6977. do_clr:
  6978.     tst.b    bank_sel
  6979.     bne    clr_b
  6980.  
  6981.     bsr    mfree_adpcm_a    *clear bank a
  6982.     bsr    mfree_pcm_a
  6983.     clr.b    data_a
  6984.     bsr    waku1
  6985.     bra    clr_wk
  6986. clr_b:
  6987.     bsr    mfree_adpcm_b    *clear bank b
  6988.     bsr    mfree_pcm_b
  6989.     clr.b    data_b
  6990.     bsr    waku2
  6991. clr_wk:
  6992.     clr.l    (a0)
  6993.     clr.l    4(a0)
  6994.     clr.l    8(a0)
  6995.     clr.l    12(a0)
  6996.     clr.l    16(a0)
  6997.     bra    ext_dc
  6998.  
  6999. all_end2:            *終了?
  7000.     movem.l    d0-d7/a0-a6,reg_buff2
  7001.     bsr    clr_bottom
  7002.     display2    sure??,%0111,0,28,19
  7003.     moveq.l    #19,d1
  7004.     moveq.l    #28,d2
  7005.     IOCS    _B_LOCATE
  7006.     IOCS    _OS_CURON
  7007.     DOS    _INKEY
  7008.     move.b    d0,d1
  7009.     bsr    mk_capital1
  7010.     cmpi.b    #'Y',d1
  7011.     beq    all_end_
  7012.     cmpi.b    #$0d,d0
  7013.     beq    all_end_
  7014. non_ope:
  7015.     IOCS    _OS_CUROF
  7016.     bsr    scr_init
  7017.     movem.l    reg_buff2(pc),d0-d7/a0-a6
  7018.     bra    complete
  7019.  
  7020. all_end:            *全ての作業を終了??
  7021.     tst.b    ESC_ON
  7022.     beq    m_lp
  7023. all_end_:
  7024. *    画面関係初期化プログラム by Y.SUZUKI
  7025.     bsr    zen_clr
  7026.     move.w    brk_wk(pc),-(sp)
  7027.     DOS    _BREAKCK
  7028.     addq.w    #2,sp
  7029.     move.w    #$0010,d1
  7030.     IOCS    _CRTMOD
  7031.     move.b    #-$02,d1
  7032.     IOCS    _CONTRAST
  7033.     IOCS    _B_CURON
  7034.     clr.l    d1
  7035.     move.l    #$005f001e,d2
  7036.     IOCS    _B_CONSOL
  7037.     IOCS    _MS_CUROF
  7038.     clr.l    d1
  7039.     move.l    #$02ff01ff,d2
  7040.     IOCS    _MS_LIMIT
  7041.     moveq.l    #$ff,d1
  7042.     IOCS    _SKEY_MOD
  7043.     pea.l    _L00009b(pc)
  7044.     DOS    _PRINT
  7045.     addq.w    #4,a7
  7046.     pea.l    _L0000a1(pc)
  7047.     DOS    _PRINT
  7048.     addq.w    #4,a7
  7049.  
  7050.     lea    ent_path(pc),a0
  7051.     move.w    (a0)+,-(sp)
  7052.     DOS    _CHGDRV
  7053.     addq.w    #2,sp
  7054.  
  7055.     pea    (a0)
  7056.     DOS    _CHDIR
  7057.     addq.w    #4,sp
  7058.  
  7059.     bsr    init_kbuf
  7060. bye_bye:
  7061.     tst.b    monitor_mode
  7062.     beq    goto_bv
  7063.     move.b    #$08,$e92003
  7064.     move.b    #%0000_0001,$e92001    *adpcm all end
  7065. goto_bv:
  7066.     bsr    back_vect
  7067.  
  7068.     pea    0.w
  7069.     DOS    _MFREE
  7070.     addq.w    #4,sp
  7071.  
  7072.     IOCS    _OS_CURON
  7073.  
  7074.     movea.l    ssp(pc),a1
  7075.     IOCS    _B_SUPER
  7076.  
  7077.     move.l    org_sp(pc),sp    *スタックを戻す
  7078.  
  7079.     DOS    _EXIT        *終了…
  7080.  
  7081. use_gram??:            *グラフィックは使用可能?
  7082.     moveq.l    #0,d1
  7083.     moveq.l    #-1,d2
  7084.     IOCS    _TGUSEMD    *グラフィックの使用状況
  7085.     tst.l   d0
  7086.     rts
  7087.  
  7088. write_data:            *ディスクへの書き込み
  7089.     * < d1.l=size
  7090.     * < a1.l=file name
  7091.     * < a2.l=data address
  7092.     * > minus=error
  7093.     * - all
  7094.     clr.l    rd_error
  7095.     movem.l    d0/d5,-(sp)
  7096.  
  7097.     bsr    check_pcm?
  7098.     bne    create
  7099.  
  7100.     move.w    #%0_000_01,-(sp)
  7101.     pea    (a1)
  7102.     DOS    _OPEN
  7103.     addq.w    #6,sp
  7104.     tst.l    d0
  7105.     bpl    copy_fh
  7106. create:
  7107.     move.w    #32,-(sp)
  7108.     pea    (a1)
  7109.     DOS    _CREATE
  7110.     addq.w    #6,sp
  7111.     move.l    d0,fo_error
  7112.     bmi    wr_exit2
  7113. copy_fh:
  7114.     move.w    d0,d5        *d5.w=file handle
  7115.  
  7116.     clr.l    disk_full
  7117.     move.l    d1,-(sp)
  7118.     pea       (a2)
  7119.     move.w    d5,-(sp)
  7120.     DOS    _WRITE
  7121.     lea    10(sp),sp
  7122.     move.l    d0,wr_error
  7123.     bmi    go_close
  7124.     cmp.l    d0,d1
  7125.     beq    go_close
  7126.     move.l    #-1,disk_full
  7127. go_close:
  7128.     move.w    d5,-(sp)
  7129.     DOS    _CLOSE
  7130.     addq.w    #2,sp
  7131.  
  7132.     tst.l    wr_error
  7133.     bmi    do_del
  7134.     tst.l    disk_full
  7135.     beq    wr_exit2
  7136. do_del:
  7137.     pea    (a1)        *書き出しエラーの場合は消去
  7138.     DOS    _DELETE
  7139.     addq.w    #4,sp
  7140. wr_exit2:
  7141.     movem.l    (sp)+,d0/d5
  7142.     rts
  7143.  
  7144. check_pcm?:            *ファイルネームがpcmかどうか
  7145.     * yes=eq / no=ne
  7146.     * - all
  7147.     movem.l    d0/a1,-(sp)
  7148.  
  7149.     move.b    (a1)+,d0
  7150.     bsr    mk_capital0
  7151.     cmpi.b    #'P',d0
  7152.     bne    bye_cp?
  7153.     move.b    (a1)+,d0
  7154.     bsr    mk_capital0
  7155.     cmpi.b    #'C',d0
  7156.     bne    bye_cp?
  7157.     move.b    (a1)+,d0
  7158.     bsr    mk_capital0
  7159.     cmpi.b    #'M',d0
  7160.     bne    bye_cp?
  7161.     moveq.l    #0,d0
  7162. bye_cp?:
  7163.     movem.l    (sp)+,d0/a1
  7164.     rts
  7165.  
  7166. open_check:            *ファイルネームが存在するかチェック
  7167.     * < (a1)=file name
  7168.     * > minus=error
  7169.     clr.l    wr_error
  7170.     movem.l    d0/d5/a0-a1,-(sp)
  7171.     clr.w    -(sp)
  7172.     pea     (a1)
  7173.     DOS    _OPEN
  7174.     addq.w    #6,sp
  7175.     move.l    d0,fo_error
  7176.     bmi    rd_exit2
  7177.     move.w    d0,d5        *d5.w=file handle
  7178.     bsr    get_fsize
  7179.     move.l    d0,d1        *d1.l=size
  7180.     seq    rd_error
  7181.     bra    rd_exit        *illegal file size
  7182.  
  7183. read_data:            *ディスクからの読み込み
  7184.     * < (a1)=file name
  7185.     * > d1.l=size
  7186.     * > d2.l=data address
  7187.     * > minus=error
  7188.     clr.l    wr_error
  7189.     movem.l    d0/d5/a0-a1,-(sp)
  7190.     lea    rd_fn(pc),a0
  7191.     tst.b    drive_name
  7192.     beq    rdt1
  7193.     move.b    drive_name(pc),(a0)+
  7194.     move.b    drive_name+1(pc),(a0)+
  7195. rdt1:
  7196.     move.b    (a1)+,(a0)+
  7197.     bne    rdt1
  7198.  
  7199.     clr.w    -(sp)
  7200.     pea     rd_fn(pc)
  7201.     DOS    _OPEN
  7202.     addq.w    #6,sp
  7203.     move.l    d0,fo_error
  7204.     bmi    rd_exit2
  7205.     move.w    d0,d5        *d5.w=file handle
  7206.     bsr    get_fsize
  7207.     move.l    d0,d1        *d1.l=size
  7208.     seq    rd_error
  7209.     beq    rd_exit        *illegal file size
  7210.  
  7211.     move.l    d0,-(sp)
  7212.     DOS    _MALLOC
  7213.     addq.w    #4,sp        *d2.l=address
  7214.     move.l    d0,mm_error
  7215.     bmi    rd_exit
  7216.     move.l    d0,d2
  7217.  
  7218.     move.l    d1,-(sp)
  7219.     move.l    d2,-(sp)
  7220.     move.w    d5,-(sp)
  7221.     DOS    _READ
  7222.     lea    10(sp),sp
  7223.     move.l    d0,rd_error
  7224. rd_exit:
  7225.     move.w    d5,-(sp)
  7226.     DOS    _CLOSE
  7227.     addq.w    #2,sp
  7228.     tst.l    rd_error
  7229.     bpl    rd_exit2
  7230.     move.l    d2,-(sp)    *読み込みエラーならばメモリを解放して終了
  7231.     DOS    _MFREE
  7232.     addq.w    #4,sp
  7233.     moveq.l    #-1,d0        *minus
  7234. rd_exit2:
  7235.     movem.l    (sp)+,d0/d5/a0-a1
  7236.     rts
  7237.  
  7238. get_fsize:
  7239.     * < d5.w=file handle
  7240.     * > d0.l=file size
  7241.     move.w    #2,-(sp)    *ファィルの長さを調べる
  7242.     pea    0.w
  7243.     move.w    d5,-(sp)
  7244.     DOS    _SEEK
  7245.      addq.w    #8,sp        *d0.l=file length
  7246.  
  7247.     move.l    d0,-(sp)
  7248.  
  7249.     clr.w    -(sp)        *ファイルポインタを元に戻す
  7250.     pea    0.w
  7251.     move.w    d5,-(sp)
  7252.     DOS    _SEEK
  7253.     addq.w    #8,sp
  7254.  
  7255.     move.l    (sp)+,d0
  7256.     rts
  7257.  
  7258. g_init:
  7259.     moveq.l    #16,d1
  7260.     IOCS    _CRTMOD        *768*512/16colors mode
  7261.     move.b    author(pc),-(sp)
  7262.     clr.b    author
  7263.     moveq.l    #38,d1
  7264.     moveq.l    #14,d2
  7265.     IOCS    _B_LOCATE
  7266.     move.w    #2,-(sp)
  7267.     pea    title(pc)
  7268.     DOS    _FPUTS
  7269.     addq.w    #6,sp
  7270.     moveq.l    #33,d1
  7271.     moveq.l    #16,d2
  7272.     IOCS    _B_LOCATE
  7273.     move.b    (sp)+,author
  7274.     move.w    #2,-(sp)
  7275.     pea    author(pc)
  7276.     DOS    _FPUTS
  7277.     addq.w    #6,sp
  7278.     IOCS    _G_CLR_ON
  7279.     moveq.l    #15,d1
  7280.     IOCS    _APAGE
  7281.     IOCS    _VPAGE
  7282.     moveq.l    #1,d1
  7283.     move.l    #29596,d2
  7284.     IOCS    _GPALET
  7285.     bsr    g_giji_clr
  7286.     bsr    waku1_
  7287.     bra    waku2_
  7288. window_init:
  7289.     moveq.l    #0,d1
  7290.     moveq.l    #0,d2
  7291.     move.w    #767,d3
  7292.     move.w    #511,d4
  7293.     IOCS    _WINDOW
  7294.     rts
  7295. clr_waku1:
  7296.     moveq.l    #0,d1
  7297.     moveq.l    #0,d2
  7298.     move.w    #767,d3
  7299.     move.w    #scr_wy*2+1,d4
  7300.     IOCS    _WINDOW
  7301.     IOCS    _WIPE
  7302. *    bsr    window_init
  7303.     rts
  7304. clr_waku2:
  7305.     moveq.l    #0,d1
  7306.     move.w    #plus_,d2
  7307.     move.w    #767,d3
  7308.     move.w    #scr_wy*2+plus_+1,d4
  7309.     IOCS    _WINDOW
  7310.     IOCS    _WIPE
  7311. *    bsr    window_init
  7312.     rts
  7313. waku1:
  7314.     bsr    clr_waku1
  7315.     pea    (a0)
  7316.     movea.l    last_txt_adas(pc),a0
  7317.     bsr    clr_ttsn
  7318.     movea.l    last_txt_adae(pc),a0
  7319.     bsr    clr_ttsn
  7320.     move.l    (sp)+,a0
  7321. waku1_:
  7322.     lea    kakomi1(pc),a1
  7323.     IOCS    _BOX
  7324.     lea    sen_1(pc),a1
  7325.     IOCS    _LINE
  7326.     rts
  7327. waku2:
  7328.     bsr    clr_waku2
  7329.     pea    (a0)
  7330.     movea.l    last_txt_adbs(pc),a0
  7331.     bsr    clr_ttsn
  7332.     movea.l    last_txt_adbe(pc),a0
  7333.     bsr    clr_ttsn
  7334.     move.l    (sp)+,a0
  7335. waku2_:
  7336.     lea    kakomi2(pc),a1
  7337.     IOCS    _BOX
  7338.     lea    sen_2(pc),a1
  7339.     IOCS    _LINE
  7340.     rts
  7341.  
  7342. other_init:
  7343.     bsr    zen_clr
  7344.  
  7345.     move.w    #-1,-(sp)
  7346.     DOS    _BREAKCK
  7347.     addq.w    #2,sp
  7348.     move.w    d0,brk_wk
  7349.  
  7350.     move.w    #2,-(sp)
  7351.     DOS    _BREAKCK
  7352.     addq.w    #2,sp
  7353.  
  7354.     moveq.l    #0,d1
  7355.     moveq.l    #0,d2
  7356.     IOCS    _SKEY_MOD
  7357.     IOCS    _MS_CUROF
  7358.     move.b    #-$02,d1
  7359.     IOCS    _CONTRAST
  7360.     clr.l    d1
  7361.     move.l    #$005f001e,d2
  7362.     IOCS    _B_CONSOL
  7363.     clr.l    d1
  7364.     move.l    #$02ff01ff,d2
  7365.     IOCS    _MS_LIMIT
  7366.     rts
  7367. zen_clr:                *テキスト画面の全プレーンクリア
  7368.     movem.l    d0-d1/a0,-(sp)
  7369.     move.w    $e8002a,-(sp)
  7370.     move.w    #%00000001_11110000,$e8002a    *同時アクセス
  7371.  
  7372.     lea    $e00000,a0
  7373.     move.w    #32*16-1,d0
  7374. clr_loop0:
  7375.     moveq.l    #24-1,d1
  7376. clr_loop1:
  7377.     clr.l    (a0)+
  7378.     dbra    d1,clr_loop1
  7379.     lea    32(a0),a0
  7380.     dbra    d0,clr_loop0
  7381.  
  7382.     move.w    (sp)+,$e8002a            *同時アクセス解除
  7383.     movem.l    (sp)+,d0-d1/a0
  7384.     rts
  7385. zen_clr2:                *テキスト画面の全プレーンクリア
  7386.     movem.l    d0-d1/a0,-(sp)
  7387.     move.w    $e8002a,-(sp)
  7388.     move.w    #%00000001_11110000,$e8002a    *同時アクセス
  7389.  
  7390.     lea    $e00000+$80*16,a0
  7391.     move.w    #31*16-1,d0
  7392.     bra    clr_loop0
  7393.  
  7394. zen_clr3:                *テキスト画面の全プレーンクリア
  7395.     movem.l    d0-d1/a0,-(sp)
  7396.     move.w    $e8002a,-(sp)
  7397.     move.w    #%00000001_11110000,$e8002a    *同時アクセス
  7398.  
  7399.     lea    $e00000+$80*32,a0
  7400.     move.w    #30*16-1,d0
  7401.     bra    clr_loop0
  7402.  
  7403. dsp_wv:                *波形の表示(CASE:PCM)
  7404.     * < a6=pcm data address
  7405.     * < d6=(adpcm) data size
  7406.     * < genten_y
  7407.     * > d1=steps,d5=_steps
  7408.     * X d0-d7,a1
  7409.     * - a0,a2-a7
  7410.                 *screen initialize
  7411.     add.l    d6,d6        *pcm count=size*2
  7412.  
  7413.     move.w    genten_y(pc),last_y    *init. work area
  7414.     move.w    #start_x,d4
  7415.     move.w    d4,last_x
  7416.     cmp.l    #scr_wx,d6
  7417.     bcs    dsp_wv2
  7418.                 *calc steps
  7419.     move.l    d6,d1
  7420.     move.l    #scr_wx,d2
  7421.     bsr    wari        *d1/d2=d1...d2
  7422.     move.l    d1,-(sp)
  7423.     move.l    d2,d5
  7424.     swap    d5
  7425.     clr.w    d5        *=andi.l #$ffff0000,d5(amari*65536)
  7426.     move.l    #scr_wx,d2
  7427.     move.l    d5,d1
  7428.     bsr    wari
  7429.     move.l    d1,d5
  7430.     tst.l    d2        *余りあるかな?
  7431.     beq    calc_steps
  7432.     addq.w    #2,d5        *d5=_steps
  7433. calc_steps:
  7434.     move.l    (sp)+,d1
  7435.     bne    make_steps
  7436.     moveq.l    #1,d1
  7437. make_steps:
  7438.     add.l    d1,d1        *d1=steps
  7439.     add.l    d6,d6
  7440.  
  7441.     moveq.l    #0,d3        *offset
  7442.     moveq.l    #0,d7
  7443. dsp_wv_lp:
  7444.     move.l    d3,d0        *src
  7445.     add.w    d5,d7
  7446.     bcc    @f
  7447.     addq.l    #2,d3
  7448. @@:
  7449.     addq.w    #1,d4        *inc x
  7450.     add.l    d1,d3        *inc steps
  7451.     cmp.l    d3,d6
  7452.     bhi    @f
  7453.     move.l    d6,d3
  7454. @@:
  7455.     lea    line_buf+8(pc),a1
  7456.     clr.w    -(a1)
  7457.     move.w    d4,-(a1)
  7458.     move.l    (a1),-(a1)
  7459. dspwvlp00:
  7460.     move.w    (a6,d0.l),d2
  7461.     bpl    @f
  7462.     cmp.w    2(a1),d2
  7463.     bgt    next_dspwvlp00
  7464.     move.w    d2,2(a1)
  7465.     bra    next_dspwvlp00
  7466. @@:
  7467.     cmp.w    6(a1),d2
  7468.     blt    next_dspwvlp00
  7469.     move.w    d2,6(a1)
  7470. next_dspwvlp00:
  7471.     addq.l    #2,d0
  7472.     cmp.l    d0,d3
  7473.     bhi    dspwvlp00        *区間内値合計
  7474. *    bsr    chk_ovf
  7475.  
  7476.     moveq.l    #max_b,d0
  7477.     move.w    2(a1),d2
  7478.     muls    #scr_wy,d2
  7479.     asr.l    d0,d2
  7480.     neg.w    d2
  7481.     add.w    genten_y(pc),d2
  7482.     move.w    d2,2(a1)
  7483.  
  7484.     move.w    6(a1),d2
  7485.     muls    #scr_wy,d2
  7486.     asr.l    d0,d2
  7487.     neg.w    d2
  7488.     add.w    genten_y(pc),d2
  7489.     move.w    d2,6(a1)
  7490.     IOCS    _LINE
  7491.  
  7492.     cmp.l    d3,d6
  7493.     bhi    dsp_wv_lp
  7494.     rts
  7495.  
  7496. dsp_wv2:            *calc steps
  7497.     move.l    d6,d2
  7498.     move.l    #scr_wx,d1
  7499.     bsr    wari        *d1/d2=d1...d2
  7500.     move.l    d1,-(sp)
  7501.     move.l    d2,d5
  7502.     swap    d5
  7503.     clr.w    d5        *=andi.l #$ffff0000,d5(amari*65536)
  7504.     move.l    d6,d2
  7505.     move.l    d5,d1
  7506.     bsr    wari
  7507.     move.l    d1,d5
  7508.     tst.l    d2        *余りあるかな?
  7509.     beq    calc_steps_
  7510.     addq.w    #1,d5        *d5=_steps
  7511. calc_steps_:
  7512.     move.l    (sp)+,d1
  7513.  
  7514.     add.l    d6,d6
  7515.  
  7516.     moveq.l    #0,d3        *offset
  7517.     moveq.l    #0,d7
  7518.     lea    line_buf(pc),a1
  7519.     move.w    genten_y(pc),2(a1)    *y0
  7520. dsp_wv_lp_:
  7521.     move.w    d4,-(sp)
  7522.     add.w    d5,d7
  7523.     bcc    @f
  7524.     addq.w    #1,d4
  7525. @@:
  7526.     add.w    d1,d4        *inc x
  7527.     move.w    (a6,d3.l),d2    *get pcm val
  7528. *    bsr    chk_ovf
  7529.     muls    #scr_wy,d2
  7530.     moveq.l    #max_b,d0
  7531.     asr.l    d0,d2
  7532.     neg.w    d2
  7533.     add.w    genten_y(pc),d2
  7534.     move.w    d2,6(a1)    *y1
  7535.     move.w    (sp)+,d2
  7536. @@:
  7537.     move.w    d2,(a1)        *x0
  7538.     move.w    d2,4(a1)    *x1
  7539.     IOCS    _LINE
  7540.     addq.w    #1,d2
  7541.     cmp.w    d2,d4
  7542.     bne    @b
  7543.     addq.l    #2,d3        *inc step
  7544.     cmp.l    d3,d6
  7545.     bhi    dsp_wv_lp_
  7546. @@:
  7547.     rts
  7548.  
  7549. dsp_wv_2:            *波形の表示#2(CASE:ADPCM)
  7550.     * < a6=adpcm data address
  7551.     * < d6=(adpcm) data size
  7552.     * < genten_y
  7553.     * > d1=steps,d5=_steps
  7554.     * X d0-d7,a1
  7555.     * - a0,a2-a7
  7556.     movem.l    d0-d7/a0-a6,-(sp)
  7557.     move.b    hk_mode(pc),d0
  7558.     beq    bye_dsp
  7559.                 *screen initialize
  7560.     add.l    d6,d6        *pcm count=size*2
  7561.  
  7562.     move.w    genten_y(pc),last_y    *init. work area
  7563.     move.w    #start_x,d4
  7564.     move.w    d4,last_x
  7565.     cmp.l    #scr_wx,d6
  7566.     bcs    _dsp_wv2
  7567.                 *calc steps
  7568.     move.l    d6,d1
  7569.     move.l    #scr_wx,d2
  7570.     bsr    wari        *d1/d2=d1...d2
  7571.     move.l    d1,-(sp)
  7572.     move.l    d2,d5
  7573.     swap    d5
  7574.     clr.w    d5        *=andi.l #$ffff0000,d5(amari*65536)
  7575.     move.l    #scr_wx,d2
  7576.     move.l    d5,d1
  7577.     bsr    wari
  7578.     move.l    d1,d5
  7579.     tst.l    d2        *余りあるかな?
  7580.     beq    _calc_steps
  7581.     addq.w    #2,d5        *d5=_steps
  7582. _calc_steps:
  7583.     move.l    (sp)+,d1
  7584.     bne    _make_steps
  7585.     moveq.l    #1,d1
  7586. _make_steps:
  7587.     move.l    a6,a2
  7588.     lea    line_buf(pc),a1
  7589.     lea    scaleval(pc),a5
  7590.     lea    levelchg(pc),a6
  7591.     moveq.l    #0,d3
  7592.     moveq.l    #0,d7
  7593.     move.w    d3,last_val-line_buf(a1)
  7594.     move.w    #$0f,work3-line_buf(a1)
  7595.  
  7596.     move.w    d3,work1-line_buf(a1)
  7597.     move.l    #1,work2-line_buf(a1)
  7598. _dsp_wv_lp00:
  7599.     move.w    d4,(a1)
  7600.     clr.w    2(a1)
  7601.     move.l    (a1),4(a1)        *init
  7602. _dsp_wv_lp01:
  7603.     subq.l    #1,d6
  7604.     bcs    bye_dsp
  7605.  
  7606.     move.b    (a2),d0
  7607.     move.w    work3(pc),d2
  7608.     and.w    d2,d0
  7609.     tst.b    d2
  7610.     bpl    @f
  7611.     lsr.b    #4,d0
  7612.     addq.w    #1,a2
  7613. @@:
  7614.     not.b    d2
  7615.     move.w    d2,work3-line_buf(a1)
  7616.     exg    d0,d1
  7617.     bsr    calc_pcm_val
  7618.     exg    d0,d1
  7619.     tst.w    d2
  7620.     bpl    @f
  7621.     cmp.w    2(a1),d2
  7622.     bgt    _next_dspwv2lp
  7623.     move.w    d2,2(a1)
  7624.     bra    _next_dspwv2lp
  7625. @@:
  7626.     cmp.w    6(a1),d2
  7627.     blt    _next_dspwv2lp
  7628.     move.w    d2,6(a1)
  7629. _next_dspwv2lp:
  7630.     subq.l    #1,work2-line_buf(a1)
  7631.     bne    _dsp_wv_lp01
  7632. *    bsr    chk_ovf
  7633.     moveq.l    #max_b,d0
  7634.     move.w    2(a1),d2
  7635.     muls    #scr_wy,d2
  7636.     asr.l    d0,d2
  7637.     neg.w    d2
  7638.     add.w    genten_y(pc),d2
  7639.     move.w    d2,2(a1)
  7640.     move.w    d4,4(a1)
  7641.  
  7642.     move.w    6(a1),d2
  7643.     muls    #scr_wy,d2
  7644.     asr.l    d0,d2
  7645.     neg.w    d2
  7646.     add.w    genten_y(pc),d2
  7647.     move.w    d2,6(a1)
  7648.     IOCS    _LINE
  7649.     addq.w    #1,d4        *inc x
  7650.  
  7651.     add.w    d5,work1-line_buf(a1)
  7652.     bcc    @f
  7653.     addq.l    #1,work2-line_buf(a1)
  7654. @@:
  7655.     add.l    d1,work2-line_buf(a1)    *inc steps
  7656.     bra    _dsp_wv_lp00
  7657. bye_dsp:
  7658.     movem.l    (sp)+,d0-d7/a0-a6
  7659.     rts
  7660.  
  7661. _dsp_wv2:
  7662.     move.l    d6,d2
  7663.     move.l    #scr_wx,d1
  7664.     bsr    wari        *d1/d2=d1...d2
  7665.     move.l    d1,-(sp)
  7666.     move.l    d2,d5
  7667.     swap    d5
  7668.     clr.w    d5        *=andi.l #$ffff0000,d5(amari*65536)
  7669.     move.l    d6,d2
  7670.     move.l    d5,d1
  7671.     bsr    wari
  7672.     move.l    d1,d5
  7673.     tst.l    d2        *余りあるかな?
  7674.     beq    _calc_steps_
  7675.     addq.w    #2,d5        *d5=_steps
  7676. _calc_steps_:
  7677.     move.l    (sp)+,d1
  7678.  
  7679.     move.l    a6,a2
  7680.     lea    line_buf(pc),a1
  7681.     lea    scaleval(pc),a5
  7682.     lea    levelchg(pc),a6
  7683.     moveq.l    #0,d3
  7684.     moveq.l    #0,d7
  7685.     move.w    d3,last_val-line_buf(a1)
  7686.     move.w    #$0f,work3-line_buf(a1)
  7687.  
  7688.     move.w    d3,work1-line_buf(a1)
  7689.     move.w    genten_y(pc),2(a1)        *y0
  7690. _dsp_wv_lp_:
  7691.     subq.l    #1,d6
  7692.     bcs    bye_dsp
  7693.     move.b    (a2),d0
  7694.     move.w    work3(pc),d2
  7695.     and.w    d2,d0
  7696.     tst.b    d2
  7697.     bpl    @f
  7698.     lsr.b    #4,d0
  7699.     addq.w    #1,a2
  7700. @@:
  7701.     not.b    d2
  7702.     move.w    d2,work3-line_buf(a1)
  7703.     exg    d0,d1
  7704.     bsr    calc_pcm_val
  7705.     exg    d0,d1
  7706. *    bsr    chk_ovf
  7707.     muls    #scr_wy,d2
  7708.     moveq.l    #max_b,d0
  7709.     asr.l    d0,d2
  7710.     neg.w    d2
  7711.     add.w    genten_y(pc),d2
  7712.     move.w    d2,6(a1)        *y1
  7713.     move.w    d4,d2
  7714.     add.w    d5,work1-line_buf(a1)
  7715.     bcc    @f
  7716.     addq.w    #1,d4
  7717. @@:
  7718.     add.w    d1,d4
  7719. @@:
  7720.     move.w    d2,(a1)            *x0
  7721.     move.w    d2,4(a1)        *x1
  7722.     IOCS    _LINE
  7723.     addq.w    #1,d2
  7724.     cmp.w    d2,d4
  7725.     bhi    @b
  7726.     bra    _dsp_wv_lp_
  7727.  
  7728. *chk_ovf:
  7729. *    cmp.w    #max/2-1,d2
  7730. *    ble    minus_ovf?
  7731. *    move.w    #max/2-1,d2
  7732. *    bra    ext_chk_ovf
  7733. *minus_ovf?:
  7734. *    cmp.w    #-max/2,d2
  7735. *    bge    ext_chk_ovf
  7736. *    move.w    #-max/2,d2
  7737. *ext_chk_ovf:
  7738. *    rts
  7739.  
  7740. mix_pcm:            *2つのPCMデータをミキシングする。
  7741.     * < d1=size1,d2=size2
  7742.     * < a1=buffer1,a2=buffer2
  7743.     * < offset
  7744.     * > buffer3,dest_size
  7745.     movem.l    d0-d7/a0-a6,-(sp)
  7746.     move.l    d1,d3
  7747.     add.l    offset(pc),d3
  7748.     cmp.l    d2,d3
  7749.     bhi    @f
  7750.     move.l    d2,d3        *d2の方が大きかったら
  7751. @@:
  7752.     move.l    d3,dest_size
  7753.     lsl.l    #2,d3        *4倍のワークエリアが必要
  7754.     move.l    d3,-(sp)
  7755.     DOS     _MALLOC
  7756.     addq.w    #4,sp
  7757.     move.l    d0,mm_error
  7758.     bsr    print_em
  7759.     bmi    ext_do_mix
  7760.     move.l    d0,buffer3
  7761.  
  7762.     movem.l    d1-d2/a1-a2,-(sp)
  7763.     move.l    d3,d2        *size
  7764.     moveq.l    #%00000101,d1    *mode
  7765.     movea.l    a2,a1        *source
  7766.     movea.l    buffer3(pc),a2    *dest
  7767.     bsr    trans_dma
  7768.     movem.l    (sp)+,d1-d2/a1-a2
  7769.  
  7770.     move.l    dest_size(pc),d3
  7771.     sub.l    d2,d3        *お尻の部分をクリア
  7772.     beq    go_mix
  7773.     move.l    buffer3(pc),a0
  7774.     add.l    d2,d2
  7775.     add.l    d2,d2
  7776.     add.l    d2,a0
  7777.     moveq.l    #0,d0
  7778. @@:
  7779.     move.l    d0,(a0)+    *いっぺんに2つクリア
  7780.     subq.l    #1,d3
  7781.     bne    @b
  7782. go_mix:
  7783.     *a1=use parameter
  7784.     movea.l    buffer3(pc),a2
  7785.     move.l    offset(pc),d2
  7786.     add.l    d2,d2
  7787.     add.l    d2,d2
  7788.     adda.l    d2,a2
  7789.     move.l    d1,d0
  7790.     bsr    do_mix
  7791. ext_do_mix:
  7792.     movem.l    (sp)+,d0-d7/a0-a6
  7793.     rts
  7794.  
  7795. do_mix:
  7796.     * < a1=source pcm data
  7797.     * < a2=dest.  pcm data
  7798.     * < d0.l=data size
  7799.     add.l    d0,d0
  7800.     tst.b    mix_mode
  7801.     bmi    ins_lp
  7802. mix_lp:
  7803.     move.w    (a1)+,d2
  7804.     add.w    (a2),d2
  7805. *    bsr    chk_ovf
  7806.     move.w    d2,(a2)+
  7807.     subq.l    #1,d0
  7808.     bne    mix_lp
  7809.     rts
  7810. ins_lp:
  7811.     move.w    (a1)+,(a2)+
  7812.     subq.l    #1,d0
  7813.     bne    ins_lp
  7814.     rts
  7815.  
  7816. trans_dma:            *DMA転送($ff00バイト以上も考慮)
  7817.     * < d1=mode
  7818.     * < d2=size
  7819.     * < a1=source addr.
  7820.     * < a2=destination addr.
  7821.     * - all
  7822.     tst.l    d2
  7823.     beq    exit_dt
  7824.     movem.l    d0-d3/a0-a2,-(sp)
  7825.     lea    d3a1(pc),a0
  7826.     move.w    d1,d3
  7827.     andi.w    #%11,d3
  7828.     add.w    d3,d3
  7829.     move.w    d3a1_op(pc,d3.w),(a0)+
  7830.     move.w    d1,d3
  7831.     andi.w    #%1100,d3
  7832.     lsr.w    #1,d3
  7833.     move.w    d3a2_op(pc,d3.w),(a0)+
  7834.     move.l    #$ff00,d3
  7835. trans_dma_lp:
  7836.     cmp.l    d3,d2
  7837.     bcs    go_single_dma
  7838.  
  7839.     movem.l    d2/a1-a2,-(sp)
  7840.     move.l    d3,d2
  7841.     IOCS    _DMAMOVE
  7842.     movem.l    (sp)+,d2/a1-a2
  7843. d3a1:    ds.w    1
  7844. d3a2:    ds.w    1
  7845.     sub.l    d3,d2
  7846.     bne    trans_dma_lp
  7847. bye_dma:
  7848.     movem.l    (sp)+,d0-d3/a0-a2
  7849. exit_dt:
  7850.     rts
  7851. d3a1_op:
  7852.     nop
  7853.     adda.l    d3,a1
  7854.     suba.l    d3,a1
  7855.     dc.w    -1
  7856. d3a2_op:
  7857.     nop
  7858.     adda.l    d3,a2
  7859.     suba.l    d3,a2
  7860.     dc.w    -1
  7861. go_single_dma:
  7862.     IOCS    _DMAMOVE
  7863.     bra    bye_dma
  7864.  
  7865. just_adpcm_to_pcm:        *ピッチチェンジやレベルチェンジを
  7866.                 *行わない単なるADPCM→PCM変換
  7867.     * < a0=adpcm data buffer
  7868.     * < a1=pcm data buffer
  7869.     * < d0.l=data size
  7870.     lea    scaleval(pc),a5
  7871.     lea    levelchg(pc),a6
  7872.     moveq.l    #0,d3
  7873.     moveq.l    #0,d7
  7874.     moveq.l    #$0f,d4
  7875.     add.l    d0,d0
  7876.     clr.w    last_val-levelchg(a6)
  7877. __atp_lp:
  7878.     move.b    (a0),d1
  7879.     and.w    d4,d1
  7880.     tst.b    d4
  7881.     bpl    __neg_d4
  7882.     lsr.b    #4,d1        *get 4bit data
  7883.     addq.w    #1,a0
  7884. __neg_d4:
  7885.     not.b    d4
  7886.     bsr    calc_pcm_val    *実際の計算
  7887.  
  7888.     move.w    d2,(a1)+    *add pcm data to buffer
  7889.  
  7890.     subq.l    #1,d0
  7891.     bne    __atp_lp
  7892.  
  7893.     rts
  7894.  
  7895. adpcm_to_pcm:                *ADPCMをPCMデータへ変換する
  7896.     * < a0=adpcm data buffer
  7897.     * < a1=pcm data buffer
  7898.     * < d0.l=data size
  7899.     * < d1.w=note shift(0~b~c(non shift)~d~18)
  7900.     * < d6.l=volume value(0%~200%)
  7901.     * > a1=data size
  7902.                 *パーセンテージを16進変換
  7903.     lea    levelchg(pc),a6
  7904.     clr.b    up_down-levelchg(a6)
  7905.  
  7906.     move.l    a1,-(sp)
  7907.     lsl.l    #7,d6
  7908.     divu    #100,d6
  7909.     andi.l    #$ffff,d6    *d6=0~200→0~256
  7910.  
  7911.     add.w    d1,d1        *d1=d1*2
  7912.     cmpi.b    #$18,d1
  7913.     beq    est        *ピッチシフトは無しのケース
  7914.     bcs    shift_down    *ピッチを下げるケース
  7915. *shift_up                *ピッチを上げるケース
  7916.     lea    frq_tbl(pc),a5
  7917.     move.w    -26(a5,d1.w),frq_flg-frq_tbl(a5)
  7918.     move.b    #1,up_down-frq_tbl(a5)    *set switch
  7919.     bra    init_wk
  7920. shift_down:
  7921.     lea    frq_tbl2(pc),a5
  7922.     move.w    (a5,d1.w),frq_flg-frq_tbl2(a5)
  7923.     st    up_down-frq_tbl2(a5)    *set switch
  7924. init_wk:
  7925.     clr.w    last_val2-levelchg(a6)
  7926.     clr.w    frq_wk-levelchg(a6)
  7927. est:
  7928.     lea    scaleval(pc),a5
  7929.     moveq.l    #0,d3
  7930.     moveq.l    #0,d7
  7931.     moveq.l    #$0f,d4
  7932.     add.l    d0,d0
  7933.     clr.w    last_val-levelchg(a6)
  7934.     clr.b    hajimete-levelchg(a6)
  7935. atp_lp:
  7936.     move.b    (a0),d1
  7937.     and.l    d4,d1
  7938.     tst.b    d4
  7939.     bpl    neg_d4
  7940.     lsr.b    #4,d1        *get 4bit data
  7941.     addq.w    #1,a0
  7942. neg_d4:
  7943.     not.b    d4
  7944.     bsr    calc_pcm_val    *実際の計算
  7945.  
  7946.     andi.l    #$ffff,d2    *ボリュームの変更
  7947.     muls    d6,d2        *d6にはパーセントが
  7948.     asr.l    #7,d2        *入っている
  7949.  
  7950.     tst.b    hajimete-levelchg(a6)    *初めて
  7951.     bne    up_or_down
  7952.     seq.b    hajimete-levelchg(a6)
  7953.     bra    wrt_pcm_dt
  7954. up_or_down:
  7955.     tst.b    up_down-levelchg(a6)
  7956.     beq    wrt_pcm_dt    *non pitch shift
  7957.     bmi    do_shift_down
  7958.  
  7959.     move.w    frq_flg(pc),d1
  7960.     add.w    d1,frq_wk-levelchg(a6)
  7961.     bcc    check_dsz
  7962.     bra    wrt_pcm_dt
  7963. do_shift_down:
  7964.     move.w    frq_flg(pc),d1
  7965.     beq    @f
  7966.     add.w    d1,frq_wk-levelchg(a6)
  7967.     bcc    wrt_pcm_dt
  7968. @@:
  7969.     move.w    d2,d1
  7970.     add.w    last_val2(pc),d1
  7971.     asr.w    d1        *線形補間
  7972.     move.w    d1,(a1)+
  7973. wrt_pcm_dt:
  7974.     move.w    d2,(a1)+    *store pcm data to buffer
  7975. check_dsz:
  7976.     move.w    d2,last_val2-levelchg(a6)
  7977.     subq.l    #1,d0
  7978.     bne    atp_lp
  7979.     sub.l    (sp)+,a1    *data size
  7980.     rts
  7981.  
  7982. adpcm_to_8pcm:                *ADPCMを8bitPCMデータへ変換する
  7983.     * < a0=adpcm data buffer
  7984.     * < a1=pcm data buffer
  7985.     * < d0.l=data size
  7986.     * < d1.w=note shift(0~b~c(non shift)~d~18)
  7987.     * < d6.l=volume value(0%~200%)
  7988.     * > a1=data size
  7989.                 *パーセンテージを16進変換
  7990.     lea    levelchg(pc),a6
  7991.     clr.b    up_down-levelchg(a6)
  7992.  
  7993.     move.l    a1,-(sp)
  7994.     lsl.l    #7,d6
  7995.     divu    #100,d6
  7996.     andi.l    #$ffff,d6    *d6=0~200→0~256
  7997.  
  7998.     add.w    d1,d1        *d1=d1*2
  7999.     cmpi.b    #$18,d1
  8000.     beq    _8est        *ピッチシフトは無しのケース
  8001.     bcs    _8shift_down    *ピッチを下げるケース
  8002. *_8shift_up:                *ピッチを上げるケース
  8003.     lea    frq_tbl(pc),a5
  8004.     move.w    -26(a5,d1.w),frq_flg-frq_tbl(a5)
  8005.     move.b    #1,up_down-frq_tbl(a5)    *set switch
  8006.     bra    _8init_wk
  8007. _8shift_down:
  8008.     lea    frq_tbl2(pc),a5
  8009.     move.w    (a5,d1.w),frq_flg-frq_tbl2(a5)
  8010.     st    up_down-frq_tbl2(a5)    *set switch
  8011. _8init_wk:
  8012.     clr.w    last_val2-levelchg(a6)
  8013.     clr.w    frq_wk-levelchg(a6)
  8014. _8est:
  8015.     lea    scaleval(pc),a5
  8016.     moveq.l    #0,d3
  8017.     moveq.l    #0,d7
  8018.     moveq.l    #$0f,d4
  8019.     add.l    d0,d0
  8020.     clr.w    last_val-levelchg(a6)
  8021.     clr.b    hajimete-levelchg(a6)
  8022. _8atp_lp:
  8023.     move.b    (a0),d1
  8024.     and.l    d4,d1
  8025.     tst.b    d4
  8026.     bpl    @f
  8027.     lsr.b    #4,d1        *get 4bit data
  8028.     addq.w    #1,a0
  8029. @@:
  8030.     not.b    d4
  8031.     bsr    calc_pcm_val    *実際の計算
  8032.  
  8033.     andi.l    #$ffff,d2    *ボリュームの変更
  8034.     muls    d6,d2        *d6にはパーセントが
  8035.     asr.l    #7,d2        *入っている
  8036.  
  8037.     tst.b    hajimete-levelchg(a6)    *初めて
  8038.     bne    @f
  8039.     seq.b    hajimete-levelchg(a6)
  8040.     bra    _8wrt_pcm_dt
  8041. @@:
  8042.     tst.b    up_down-levelchg(a6)
  8043.     beq    _8wrt_pcm_dt    *non pitch shift
  8044.     bmi    _8do_shift_down
  8045.  
  8046.     move.w    frq_flg(pc),d1
  8047.     add.w    d1,frq_wk-levelchg(a6)
  8048.     bcc    _8check_dsz
  8049.     bra    _8wrt_pcm_dt
  8050. _8do_shift_down:
  8051.     move.w    frq_flg(pc),d1
  8052.     beq    @f
  8053.     add.w    d1,frq_wk-levelchg(a6)
  8054.     bcc    _8wrt_pcm_dt
  8055. @@:
  8056.     move.w    d2,d1
  8057.     add.w    last_val2(pc),d1
  8058.     asr.w    d1        *線形補間
  8059.     bsr    reduce_8bit
  8060.     move.b    d1,(a1)+
  8061. _8wrt_pcm_dt:
  8062.     move.w    d2,d1
  8063.     bsr    reduce_8bit
  8064.     move.b    d1,(a1)+    *store pcm data to buffer
  8065. _8check_dsz:
  8066.     move.w    d2,last_val2-levelchg(a6)
  8067.     subq.l    #1,d0
  8068.     bne    _8atp_lp
  8069.     sub.l    (sp)+,a1    *data size
  8070.     rts
  8071.  
  8072. reduce_8bit:
  8073.     cmpi.w    #-128,d1
  8074.     bge    @f
  8075.     moveq.l    #-128,d1
  8076.     rts
  8077. @@:
  8078.     cmpi.w    #127,d1
  8079.     ble    @f
  8080.     moveq.l    #127,d1
  8081. @@:
  8082.     rts
  8083.  
  8084. calc_pcm_val:
  8085.     * < d1.b=adpcm value
  8086.     * < d7.w=scale level
  8087.     * > d2.w=pcm value
  8088.     * > d7.w=next scale level
  8089.     * > d1.b=adpcm*2
  8090.     * X d3 d2
  8091.  
  8092.     add.b    d1,d1
  8093. calc_pcm_val_:
  8094.     add.b    d7,d7
  8095.     move.w    (a5,d7.w),d3    *=d
  8096.     lsr.b    d7
  8097.  
  8098.     move.w    cpv(pc,d1.w),d2
  8099.     jmp    cpv(pc,d2.w)
  8100. abc:
  8101.     add.w    last_val(pc),d2
  8102. *    bsr    chk_ovf
  8103.     move.w    d2,last_val-levelchg(a6)    *d2=pcmdata
  8104.  
  8105.     add.w    (a6,d1.w),d7        *scalelevl+=levelchg(adpcm value)
  8106.     bmi    rst_sclv
  8107.     cmpi.w    #48,d7
  8108.     bls    allend
  8109.     moveq.l    #48,d7
  8110. allend:
  8111.     rts
  8112. rst_sclv:
  8113.     moveq.l    #0,d7
  8114.     rts
  8115.  
  8116. cpv:
  8117.     dc.w    cpv0000-cpv
  8118.     dc.w    cpv0001-cpv
  8119.     dc.w    cpv0010-cpv
  8120.     dc.w    cpv0011-cpv
  8121.     dc.w    cpv0100-cpv
  8122.     dc.w    cpv0101-cpv
  8123.     dc.w    cpv0110-cpv
  8124.     dc.w    cpv0111-cpv
  8125.     dc.w    cpv1000-cpv
  8126.     dc.w    cpv1001-cpv
  8127.     dc.w    cpv1010-cpv
  8128.     dc.w    cpv1011-cpv
  8129.     dc.w    cpv1100-cpv
  8130.     dc.w    cpv1101-cpv
  8131.     dc.w    cpv1110-cpv
  8132.     dc.w    cpv1111-cpv
  8133.  
  8134. cpv0000:
  8135.     lsr.w    #3,d3
  8136.     move.w    d3,d2
  8137.     bra    abc
  8138. cpv0001:
  8139.     lsr.w    #2,d3
  8140.     move.w    d3,d2
  8141.     lsr.w    d3
  8142.     add.w    d3,d2
  8143.     bra    abc
  8144. cpv0010:
  8145.     lsr.w    d3
  8146.     move.w    d3,d2
  8147.     lsr.w    #2,d3
  8148.     add.w    d3,d2
  8149.     bra    abc
  8150. cpv0011:
  8151.     lsr.w    d3
  8152.     move.w    d3,d2
  8153.     lsr.w    d3
  8154.     add.w    d3,d2
  8155.     lsr.w    d3
  8156.     add.w    d3,d2
  8157.     bra    abc
  8158. cpv0100:
  8159.     move.w    d3,d2
  8160.     lsr.w    #3,d3
  8161.     add.w    d3,d2
  8162.     bra    abc
  8163. cpv0101:
  8164.     move.w    d3,d2
  8165.     lsr.w    #2,d3
  8166.     add.w    d3,d2
  8167.     lsr.w    d3
  8168.     add.w    d3,d2
  8169.     bra    abc
  8170. cpv0110:
  8171.     move.w    d3,d2
  8172.     lsr.w    d3
  8173.     add.w    d3,d2
  8174.     lsr.w    #2,d3
  8175.     add.w    d3,d2
  8176.     bra    abc
  8177. cpv0111:
  8178.     move.w    d3,d2
  8179.     lsr.w    d3
  8180.     add.w    d3,d2
  8181.     lsr.w    d3
  8182.     add.w    d3,d2
  8183.     lsr.w    d3
  8184.     add.w    d3,d2
  8185.     bra    abc
  8186. cpv1000:
  8187.     lsr.w    #3,d3
  8188.     move.w    d3,d2
  8189.     neg.w    d2
  8190.     bra    abc
  8191. cpv1001:
  8192.     lsr.w    #2,d3
  8193.     move.w    d3,d2
  8194.     lsr.w    d3
  8195.     add.w    d3,d2
  8196.     neg.w    d2
  8197.     bra    abc
  8198. cpv1010:
  8199.     lsr.w    d3
  8200.     move.w    d3,d2
  8201.     lsr.w    #2,d3
  8202.     add.w    d3,d2
  8203.     neg.w    d2
  8204.     bra    abc
  8205. cpv1011:
  8206.     lsr.w    d3
  8207.     move.w    d3,d2
  8208.     lsr.w    d3
  8209.     add.w    d3,d2
  8210.     lsr.w    d3
  8211.     add.w    d3,d2
  8212.     neg.w    d2
  8213.     bra    abc
  8214. cpv1100:
  8215.     move.w    d3,d2
  8216.     lsr.w    #3,d3
  8217.     add.w    d3,d2
  8218.     neg.w    d2
  8219.     bra    abc
  8220. cpv1101:
  8221.     move.w    d3,d2
  8222.     lsr.w    #2,d3
  8223.     add.w    d3,d2
  8224.     lsr.w    d3
  8225.     add.w    d3,d2
  8226.     neg.w    d2
  8227.     bra    abc
  8228. cpv1110:
  8229.     move.w    d3,d2
  8230.     lsr.w    d3
  8231.     add.w    d3,d2
  8232.     lsr.w    #2,d3
  8233.     add.w    d3,d2
  8234.     neg.w    d2
  8235.     bra    abc
  8236. cpv1111:
  8237.     move.w    d3,d2
  8238.     lsr.w    d3
  8239.     add.w    d3,d2
  8240.     lsr.w    d3
  8241.     add.w    d3,d2
  8242.     lsr.w    d3
  8243.     add.w    d3,d2
  8244.     neg.w    d2
  8245.     bra    abc
  8246.  
  8247. pcm_to_adpcm:            *PCMデータをADPCMデータへ変換する
  8248.     * < a0=adpcm data buffer
  8249.     * < a1=pcm data buffer
  8250.     * < d0.l=data size
  8251.     * X d0-d5/a1,a2,a5,a6
  8252.  
  8253.     lea    scaleval(pc),a5
  8254.     lea    levelchg(pc),a6
  8255.  
  8256.     moveq.l    #0,d6        *scalelevel=0
  8257.     moveq.l    #0,d7
  8258.     moveq.l    #0,d4
  8259.     add.l    d0,d0
  8260.     move.w    d4,last_val-levelchg(a6)    *last_val=0
  8261. pta_lp:
  8262.     move.w    (a1)+,d3    *d3=pcm data
  8263.     bsr    calc_adpcm_val
  8264.     not.b    d4
  8265.     bne.s    set_lower
  8266.                 *case upper 4bits
  8267.     lsl.b    #4,d1
  8268.     or.b    d1,d5
  8269.     move.b    d5,(a0)+
  8270.     bra    check_cnt
  8271. set_lower:
  8272.     move.b    d1,d5
  8273. check_cnt:
  8274.     subq.l    #1,d0
  8275.     bne    pta_lp
  8276.     rts
  8277.  
  8278. calc_adpcm_val:
  8279.     * < d3.w=pcm value
  8280.     * < d7.w=scale level
  8281.     * > d1.b=adpcm value
  8282.     * > d7.w=next scale level
  8283.     * X
  8284.     sub.w    last_val(pc),d3        *d3=diff
  8285.     bmi    case_diff_minus
  8286.     moveq.l    #0,d1
  8287.     bra    calc_diff
  8288. case_diff_minus:
  8289.     neg.w    d3
  8290.     moveq.l    #8,d1        *d1:become data
  8291. calc_diff:
  8292.     add.b    d7,d7
  8293.     move.w    (a5,d7.w),d2    *=d
  8294.     lsr.b    d7
  8295.  
  8296.     cmp.w    d3,d2
  8297.     bge    _or2
  8298.     sub.w    d2,d3
  8299.     ori.b    #4,d1
  8300. _or2:
  8301.     lsr.w    d2
  8302.     cmp.w    d3,d2
  8303.     bge    _or1
  8304.     sub.w    d2,d3
  8305.     ori.b    #2,d1
  8306. _or1:
  8307.     lsr.w    d2
  8308.     cmp.w    d3,d2
  8309.     bge    chg_scalelvl
  8310.     ori.b    #1,d1
  8311.  
  8312. chg_scalelvl:
  8313.     add.b    d1,d1
  8314.     add.w    (a6,d1.w),d7        *scalelevl+=levelchg(adpcm value)
  8315.     bmi    rst_sclv_
  8316.     cmpi.w    #48,d7
  8317.     bls    mk_olv
  8318.     moveq.l    #48,d7
  8319.     bra    mk_olv
  8320. rst_sclv_:
  8321.     moveq.l    #0,d7
  8322. mk_olv:
  8323.     exg    d7,d6
  8324.     bsr    calc_pcm_val_
  8325.     exg    d6,d7
  8326.     lsr.b    d1
  8327.     rts
  8328.  
  8329. line_ln:    equ    168        *縦線の長さ
  8330. txt_ln:                *テキストの(赤い)縦ライン
  8331.     * < d0.w=x
  8332.     * < d1.w=y
  8333.     * < a0.l=del.addr.
  8334.     * < a1.l=write plane addr.
  8335.     * > a0.l=del.addr.
  8336.     bsr    clr_ttsn
  8337.     move.l    #$ffff,d2
  8338.     and.l    d2,d1
  8339.     and.l    d2,d0
  8340.     lsl.l    #7,d1        *y=y*$80
  8341.     move.w    d0,d2
  8342.     andi.b    #$0f,d2
  8343.     eori.b    #$0f,d2        *どのビット?
  8344.     moveq.l    #0,d3
  8345.     bset    d2,d3        *wrt data
  8346.     lsr.w    #4,d0        *d0=true x
  8347.     lsl.w    d0
  8348.     add.l    d1,d0
  8349.     adda.l    d0,a1
  8350.     pea    (a1)
  8351.     move.w    #line_ln,d1
  8352. txt_ln_lp:
  8353.     move.w    d3,(a1)
  8354.     lea    $80(a1),a1
  8355.     dbra    d1,txt_ln_lp
  8356.     move.l    (sp)+,a0
  8357.     rts
  8358.  
  8359. clr_ttsn:
  8360.     cmpa.l    #0,a0
  8361.     beq    @f
  8362.     move.w    #line_ln,d2    *ラインを消去
  8363. del_lnlp:
  8364.     clr.w    (a0)
  8365.     lea    $80(a0),a0
  8366.     dbra    d2,del_lnlp
  8367. @@:
  8368.     rts
  8369.  
  8370. scr_init:    *コンソール下部の初期化
  8371.     bsr    clr_em_area
  8372.     bsr    clr_bottom    *画面下部の消去
  8373.     moveq.l    #0,d7
  8374.     bsr    _bank_a
  8375.     bsr    _bank_b
  8376.     bsr    _stpt1
  8377.     bsr    _edpt1
  8378.     bsr    _stpt2
  8379.     bsr    _edpt2
  8380.     bsr    _mon
  8381.     bsr    _dt_tp
  8382.     bsr    _smp_tm
  8383.     bsr    _sec
  8384.     bsr    _smp_sz
  8385.     bsr    _bytes
  8386.     bsr    _smp_rt
  8387.     bsr    _khz
  8388.     bsr    _out_as
  8389.     bsr    _at_md
  8390.     bsr    _quit
  8391.     bsr    _play
  8392.     bsr    _rec
  8393.     bsr    _files
  8394.     bsr    _pitch
  8395.     bsr    _level
  8396.     bsr    _mix
  8397.  
  8398.     move.b    monitor_mode(pc),d0
  8399.     bsr    mt_on_off
  8400.     move.b    data_type(pc),d0
  8401.     bsr    dt_type
  8402.     move.b    sampling_rate(pc),d0
  8403.     bsr    smp_rate
  8404.     move.b    out_assign(pc),d0
  8405.     bsr    pan_pot
  8406.     move.b    trigger(pc),d0
  8407.     bsr    trg_on_off
  8408.  
  8409.     moveq.l    #0,d0
  8410.     move.b    sampling_rate(pc),d0
  8411.     lsl.w    d0
  8412.     lea    rate_tbl(pc),a0
  8413.     move.w    (a0,d0.w),d0        *freq
  8414.     move.l    rec_data_size(pc),d1
  8415.     add.l    d1,d1            *d1=d1*2(sz=sz*2)
  8416.     divu    d0,d1            *d1=time
  8417.     bne    disp_st__
  8418.     moveq.l    #1,d1            *1秒以下は皆1秒とする
  8419. disp_st__:
  8420.     moveq.l    #0,d0
  8421.     move.w    d1,d0
  8422.     move.w    d0,recording_time
  8423.     bsr    rec_time
  8424.     move.l    rec_data_size(pc),d0
  8425.     bsr    data_size
  8426.     bsr    init_hex_area_a
  8427.     bsr    init_hex_area_b
  8428.     rts
  8429. init_hex_area_a:            *16進数表示エリアを初期化
  8430.     movem.l    d0-d7/a0-a6,-(sp)
  8431.  
  8432.     moveq.l    #12,d1        *x
  8433.     moveq.l    #11,d2        *y
  8434.     IOCS    _B_LOCATE
  8435.     moveq.l    #0,d1
  8436.     IOCS    _B_ERA_ST
  8437.  
  8438.     moveq.l    #12,d1        *x
  8439.     moveq.l    #12,d2        *y
  8440.     IOCS    _B_LOCATE
  8441.     moveq.l    #0,d1
  8442.     IOCS    _B_ERA_ST
  8443.  
  8444.     moveq.l    #0,d6
  8445.     moveq.l    #'5',d0
  8446.     bsr    data_move_
  8447.  
  8448.     addq.b    #1,d6
  8449.     moveq.l    #'5',d0
  8450.     tst.l    end_point1
  8451.     bne    do_dm_a
  8452.     moveq.l    #'.',d0
  8453. do_dm_a:
  8454.     bsr    data_move_
  8455.     bsr    ofsst1
  8456.     bsr    ofsed1
  8457.  
  8458.     move.w    $e8002a,d6
  8459.     move.w    #%00000001_1100_0000,$e8002a    *同時アクセス
  8460.  
  8461.     move.w    #52*8+4,d1
  8462.     move.w    #13*16,d2
  8463.     lea    sankaku(pc),a1
  8464.     IOCS    _TEXTPUT
  8465.  
  8466.      move.w    d6,$e8002a            *同時アクセス解除
  8467.     movem.l    (sp)+,d0-d7/a0-a6
  8468.     rts
  8469.  
  8470. init_hex_area_b:            *16進数表示エリアを初期化
  8471.     movem.l    d0-d7/a0-a6,-(sp)
  8472.  
  8473.     moveq.l    #12,d1        *x
  8474.     moveq.l    #25,d2        *y
  8475.     IOCS    _B_LOCATE
  8476.     moveq.l    #0,d1
  8477.     IOCS    _B_ERA_ST
  8478.  
  8479.     moveq.l    #12,d1        *x
  8480.     moveq.l    #26,d2        *y
  8481.     IOCS    _B_LOCATE
  8482.     moveq.l    #0,d1
  8483.     IOCS    _B_ERA_ST
  8484.  
  8485.     moveq.l    #2,d6
  8486.     moveq.l    #'5',d0
  8487.     bsr    data_move_
  8488.  
  8489.     addq.b    #1,d6
  8490.     moveq.l    #'5',d0
  8491.     tst.l    end_point2
  8492.     bne    do_dm_b
  8493.     moveq.l    #'.',d0
  8494. do_dm_b:
  8495.     bsr    data_move_
  8496.     bsr    ofsst2
  8497.     bsr    ofsed2
  8498.  
  8499.     move.w    $e8002a,d6
  8500.     move.w    #%00000001_1100_0000,$e8002a    *同時アクセス
  8501.  
  8502.     move.w    #52*8+4,d1
  8503.     move.w    #27*16,d2
  8504.     lea    sankaku(pc),a1
  8505.     IOCS    _TEXTPUT
  8506.  
  8507.      move.w    d6,$e8002a            *同時アクセス解除
  8508.     movem.l    (sp)+,d0-d7/a0-a6
  8509.     rts
  8510.  
  8511. clr_bottom:
  8512.     movem.l    d0-d2,-(sp)
  8513.     bsr    init_kbuf
  8514.     moveq.l    #0,d1
  8515.     moveq.l    #28,d2
  8516.     IOCS    _B_LOCATE
  8517.     moveq.l    #0,d1
  8518.     IOCS    _B_CLR_ST
  8519.     movem.l    (sp)+,d0-d2
  8520.     rts
  8521. val_init:
  8522.     movem.l    d0/a0,-(sp)
  8523.     moveq.l    #0,d0
  8524.     lea    monitor_mode(pc),a0            *on
  8525.     move.b    d0,(a0)                    *on
  8526.     st    data_type-monitor_mode(a0)        *adpcm
  8527.     move.b    #4,sampling_rate-monitor_mode(a0)    *15kHz
  8528.     move.b    #3,out_assign-monitor_mode(a0)        *middle
  8529.     move.b    d0,trigger-monitor_mode(a0)        *off
  8530.     move.w    #8/2,recording_time-monitor_mode(a0)    *8seconds
  8531.     move.l    #62400/2,rec_data_size-monitor_mode(a0)
  8532.     move.l    d0,file_list-monitor_mode(a0)
  8533.  
  8534.     move.l    d0,address1-monitor_mode(a0)
  8535.     move.l    d0,address2-monitor_mode(a0)
  8536.     move.l    d0,start_point1-monitor_mode(a0)
  8537.     move.l    d0,start_point2-monitor_mode(a0)
  8538.     move.l    d0,end_point1-monitor_mode(a0)
  8539.     move.l    d0,end_point2-monitor_mode(a0)
  8540.     move.l    d0,size1-monitor_mode(a0)
  8541.     move.l    d0,size2-monitor_mode(a0)
  8542.     move.l    d0,buffer1-monitor_mode(a0)
  8543.     move.l    d0,buffer2-monitor_mode(a0)
  8544.     st.b    prt_md-monitor_mode(a0)
  8545.     move.b    #':',cdr_str+1-monitor_mode(a0)
  8546.     move.b    #'\',cdr_str+2-monitor_mode(a0)
  8547.     movem.l    (sp)+,d0/a0
  8548.     rts
  8549.  
  8550.     *メッセージの表示部
  8551.     * < d7=8:reverse / 0=normal
  8552. _bank_a:
  8553.     move.b    d7,-(sp)
  8554.     tst.b    bank_sel
  8555.     bne    not_a_
  8556.     eori.b    #8,d7
  8557. not_a_:
  8558.     display    bank_a,%0110,0,0,8
  8559.     tst.b    data_a
  8560.     beq    erasebnka
  8561.     display3    bank_a_fn,%0110,9,0
  8562.     bra    dobnka
  8563. erasebnka:
  8564.     moveq.l    #9,d1
  8565.     moveq.l    #0,d2
  8566.     IOCS    _B_LOCATE
  8567.     moveq.l    #0,d1
  8568.     IOCS    _B_ERA_ST
  8569. dobnka:
  8570.     bsr    ofsttl_a
  8571.     bsr    ofsst1
  8572.     bsr    ofsed1
  8573.     move.b    (sp)+,d7
  8574.     rts
  8575.  
  8576. _bank_b:
  8577.     move.b    d7,-(sp)
  8578.     tst.b    bank_sel
  8579.     beq    not_b_
  8580.     eori.b    #8,d7
  8581. not_b_:
  8582.     display    bank_b,%0110,0,14,8
  8583.     tst.b    data_b
  8584.     beq    erasebnkb
  8585.     display3    bank_b_fn,%0110,9,14
  8586.     bra    dobnkb
  8587. erasebnkb:
  8588.     moveq.l    #9,d1
  8589.     moveq.l    #14,d2
  8590.     IOCS    _B_LOCATE
  8591.     moveq.l    #0,d1
  8592.     IOCS    _B_ERA_ST
  8593. dobnkb:
  8594.     bsr    ofsttl_b
  8595.     bsr    ofsst2
  8596.     bsr    ofsed2
  8597.     move.b    (sp)+,d7
  8598.     rts
  8599.  
  8600. _stpt1:
  8601.     display    stpt,%0111,0,11,11
  8602.     rts
  8603. _edpt1:
  8604.     display    edpt,%0111,0,12,11
  8605.     rts
  8606. _stpt2:
  8607.     display    stpt,%0111,0,25,11
  8608.     rts
  8609. _edpt2:
  8610.     display    edpt,%0111,0,26,11
  8611.     rts
  8612. _mon:
  8613.     display    mt_on,%0111,0,28,8
  8614.     rts
  8615. _dt_tp:
  8616.     display    dt_tp,%0111,15,28,10
  8617.     rts
  8618. _smp_tm:
  8619.     display    smp_tm,%0111,32,28,14
  8620.     rts
  8621. _sec:
  8622.     display    sec,%0111,50,28,6
  8623.     rts
  8624. _smp_rt:
  8625.     display    smp_rt,%0111,56,28,14
  8626.     rts
  8627. _khz:
  8628.     display    khz,%0111,74,28,6
  8629.     rts
  8630. _out_as:
  8631.     display    out_as,%0111,0,30,7
  8632.     rts
  8633. _at_md:
  8634.     display    at_md,%0111,15,30,8
  8635.     rts
  8636. _smp_sz:
  8637.     display    smp_sz,%0111,28,30,14
  8638.     rts
  8639. _bytes:
  8640.     display    bytes,%0111,50,30,10
  8641. _quit:
  8642.     display    quit,%0101,89,30,4
  8643.     rts
  8644. _play:
  8645.     display    play,%0110,81,30,4
  8646.     rts
  8647. _rec:
  8648.     display    rec,%0110,81,28,6
  8649.     rts
  8650. _files:
  8651.     display    files,%0101,89,28,4
  8652.     rts
  8653. _level:
  8654.     display    level,%0110,56,30,6
  8655.     rts
  8656. _pitch:
  8657.     display    pitch,%0110,64,30,5
  8658.     rts
  8659. _mix:
  8660.     display    mix,%0110,71,30,8
  8661.     rts
  8662.  
  8663.     *値の表示
  8664.     * < d0=data,d7=attribute
  8665. mt_on_off:
  8666.     move.b    d0,monitor_mode
  8667.     beq    case_m_of
  8668.     display    on_msg,%0011,8,28,3
  8669.     rts
  8670. case_m_of:
  8671.     display    of_msg,%0011,8,28,3
  8672.     rts
  8673. dt_type:
  8674.     move.b    d0,data_type
  8675.     beq    case_pcm
  8676.     display    tp_adp,%0011,25,28,5
  8677.     rts
  8678. case_pcm:
  8679.     display    tp_pcm,%0011,25,28,5
  8680.     rts
  8681. smp_rate:
  8682.     lea    _39(pc),a1
  8683.     move.b    d0,sampling_rate-_39(a1)
  8684.     ext.w    d0
  8685.     lsl.w    #2,d0
  8686.     adda.w    d0,a1
  8687.     moveq.l    #%0011,d1
  8688.     or.b    d7,d1
  8689.     moveq.l    #70,d2
  8690.     moveq.l    #28,d3
  8691.     moveq.l    #3,d4
  8692.     IOCS    _B_PUTMES
  8693.     rts
  8694. pan_pot:
  8695.     lea    mute(pc),a1
  8696.     move.b    d0,out_assign-mute(a1)
  8697.     ext.w    d0
  8698.     lsl.w    #3,d0
  8699.     adda.w    d0,a1
  8700.     moveq.l    #%0011,d1
  8701.     or.b    d7,d1
  8702.     moveq.l    #7,d2
  8703.     moveq.l    #30,d3
  8704.     moveq.l    #5,d4
  8705.     IOCS    _B_PUTMES
  8706.     rts
  8707.  
  8708. trg_on_off:
  8709.     move.b    d0,trigger
  8710.     beq    case_t_off
  8711.     display    on_msg,%0011,23,30,3
  8712.     rts
  8713. case_t_off:
  8714.     display    of_msg,%0011,23,30,3
  8715.     rts
  8716. rec_time:
  8717.     move.w    d0,recording_time
  8718.     bsr    num_to_str
  8719.     display    suji+6,%0011,46,28,4
  8720.     rts
  8721. data_size:
  8722.     move.l    d0,rec_data_size
  8723.     bsr    num_to_str
  8724.     display    suji+2,%0011,42,30,8
  8725.     rts
  8726. _num_to_str:    *レジスタの値を文字数列にする
  8727.     movem.l    d1-d4/a0-a1,-(sp)
  8728.     moveq.l    #'0',d4
  8729.     bra    @f
  8730. num_to_str:    *レジスタの値を文字数列にする
  8731.     * < d0.l=value
  8732.     * > suji
  8733.     * - all
  8734.     movem.l    d1-d4/a0-a1,-(sp)
  8735.     moveq.l    #' ',d4
  8736. @@:
  8737.     lea    suji(pc),a0
  8738.     clr.b    hajimete-suji(a0)
  8739.     moveq.l    #9,d1
  8740.     lea    exp_tbl(pc),a1
  8741. ex_loop0:
  8742.     moveq.l    #0,d2
  8743.     move.l    (a1)+,d3
  8744. ex_loop1:
  8745.     sub.l    d3,d0
  8746.     bcs    xbcd_str
  8747.     addq.b    #1,d2
  8748.     bra    ex_loop1
  8749. xbcd_str:
  8750.     add.l    d3,d0
  8751.     tst.b    d2
  8752.     bne    nml_ktset
  8753.     tst.b    hajimete
  8754.     bne    nml_ktset
  8755.     move.b    d4,(a0)+    *dummy
  8756.     bra    nml_lp_ope
  8757.  
  8758. nml_ktset:
  8759.     st    hajimete
  8760.     add.b    #'0',d2
  8761.     move.b    d2,(a0)+
  8762. nml_lp_ope:
  8763.     dbra    d1,ex_loop0
  8764.     tst.b    hajimete
  8765.     bne    @f
  8766.     move.b    #'0',-1(a0)
  8767. @@:
  8768.     clr.b    (a0)        *end flg
  8769.     movem.l    (sp)+,d1-d4/a0-a1
  8770.     rts
  8771.  
  8772. test_mode:            *PCM/ADPCMデータのテスト再生
  8773.     bsr    clr_bottom
  8774.     move.b    data_type(pc),dt_mem
  8775.     lea    pcm_test(pc),a0    *use later
  8776.     display2_    1(a0),%1111,0,28,9
  8777.     moveq.l    #0,d1
  8778.     bsr    input_fn
  8779. test_play_:
  8780.     move.l    a1,d0
  8781.     beq    exit_ld_md
  8782.     bsr    ext_chk        *拡張子のチェック
  8783.     bsr    saisei        *ADPCM再生
  8784.     tst.b    use_fm
  8785.     beq    exit_ld_md
  8786.     move.l    #nameptr,work3
  8787.     movem.l    reg_buff(pc),d0-d7/a0-a6
  8788.     pea    test_play_(pc)    *push return addr.
  8789.     bra    hot_start
  8790.  
  8791. saisei:
  8792.     * < d1.l=size
  8793.     * < a1.l=filename pointer
  8794.     * - all
  8795.     movem.l    d0-d7/a0-a6,-(sp)
  8796.     moveq.l    #0,d1
  8797.     IOCS    _ADPCMMOD    *adpcm stop
  8798.  
  8799.     bsr    read_data    *d1=size,d2=address
  8800.     movea.l    d2,a1        *data address
  8801.     move.l    d1,d2        *size
  8802.     bsr    print_em
  8803.     bmi    naranai_
  8804.     tst.b    data_type
  8805.     bne    _saisei
  8806.                 *PCM dataの再生のケース
  8807.     bsr    get_pt1
  8808.     bsr    dsp_cv_mes
  8809.     move.l    d2,d1
  8810.     lsr.l    #2,d1
  8811.     move.l    d1,-(sp)    *adpcm data分確保
  8812.     DOS    _MALLOC
  8813.     addq.w    #4,sp
  8814.     move.l    d0,mm_error
  8815.     bsr    print_em
  8816.     bmi    naranai        *case:error
  8817.     move.l    d0,a0        *for adpcm_data
  8818.     move.l    d1,d0        *size
  8819.     movem.l    d1/a0-a1,-(sp)
  8820.     bsr    pcm_to_adpcm
  8821.     movem.l    (sp)+,d1/a0-a1
  8822.     pea    (a1)
  8823.     DOS    _MFREE        *mfree pcm data
  8824.     addq.w    #4,sp
  8825.     move.l    a0,a1        *a1=adpcm data adr
  8826.     move.l    d1,d2        *d2=size of adpcm data
  8827.     bsr    put_pt1
  8828. _saisei:
  8829.     move.b    sampling_rate(pc),d1
  8830.     lsl.w    #8,d1
  8831.     move.b    out_assign(pc),d1
  8832.     IOCS    _ADPCMOUT
  8833. naranai:
  8834.     pea    (a1)
  8835.     DOS    _MFREE
  8836.     addq.w    #4,sp
  8837. naranai_:
  8838.     movem.l    (sp)+,d0-d7/a0-a6
  8839.     rts
  8840.  
  8841. ofsttl_a:
  8842.     movem.l    d0-d4/a0-a1,-(sp)
  8843.     display2    ofsbar,%0011,34,0,60
  8844.     lea    $e00000+35,a1
  8845.     lea    stp0(pc),a0
  8846.     bsr    cgwr
  8847.     lea    $e00000+35+$80*8,a1
  8848.     lea    stp1(pc),a0
  8849.     bsr    cgwr
  8850.     lea    $e00000+54,a1
  8851.     lea    edp0(pc),a0
  8852.     bsr    cgwr
  8853.     lea    $e00000+54+$80*8,a1
  8854.     lea    edp1(pc),a0
  8855.     bsr    cgwr
  8856.     lea    $e00000+73,a1
  8857.     lea    efsz0(pc),a0
  8858.     bsr    cgwr
  8859.     lea    $e00000+73+$80*8,a1
  8860.     lea    efsz1(pc),a0
  8861.     bsr    cgwr
  8862.     movem.l    (sp)+,d0-d4/a0-a1
  8863.     rts
  8864.  
  8865. ofsttl_b:
  8866.     movem.l    d0-d4/a0-a1,-(sp)
  8867.     display2    ofsbar,%0011,34,14,60
  8868.     lea    $e00000+35+$80*14*16,a1
  8869.     lea    stp0(pc),a0
  8870.     bsr    cgwr
  8871.     lea    $e00000+35+$80*8+$80*14*16,a1
  8872.     lea    stp1(pc),a0
  8873.     bsr    cgwr
  8874.     lea    $e00000+54+$80*14*16,a1
  8875.     lea    edp0(pc),a0
  8876.     bsr    cgwr
  8877.     lea    $e00000+54+$80*8+$80*14*16,a1
  8878.     lea    edp1(pc),a0
  8879.     bsr    cgwr
  8880.     lea    $e00000+73+$80*14*16,a1
  8881.     lea    efsz0(pc),a0
  8882.     bsr    cgwr
  8883.     lea    $e00000+73+$80*8+$80*14*16,a1
  8884.     lea    efsz1(pc),a0
  8885.     bsr    cgwr
  8886.     movem.l    (sp)+,d0-d4/a0-a1
  8887.     rts
  8888.  
  8889. cgwr:
  8890.     * < a1.l=write address
  8891.     movem.l    d0-d1/a0/a2,-(sp)
  8892.     move.w    sr,-(sp)
  8893.     ori.w    #$0700,sr
  8894.     move.w    $e8002a,-(sp)
  8895.     move.w    #%00000001_00110000,$e8002a    *同時アクセス
  8896. cgwrlp:
  8897.     moveq.l    #0,d0
  8898.     move.b    (a0)+,d0
  8899.     beq    exit_cgwr
  8900.     pea    (a1)
  8901.     lsl.w    #3,d0
  8902.     lea    $f3a000,a2    *CG ADR
  8903.     add.w    d0,a2
  8904.     moveq.l    #8-1,d1
  8905. @@:
  8906.     move.b    (a2)+,(a1)
  8907.     lea    $80(a1),a1
  8908.     dbra    d1,@b
  8909.     move.l    (sp)+,a1
  8910.     addq.w    #1,a1
  8911.     bra    cgwrlp
  8912. exit_cgwr:
  8913.     move.w    (sp)+,$e8002a
  8914.     move.w    (sp)+,sr
  8915.     movem.l    (sp)+,d0-d1/a0/a2
  8916.     rts
  8917.  
  8918. _data:        equ    36
  8919. _disp_max:    equ    60
  8920. fsy:        equ    2        *メニューの開始y座標
  8921. fey:        equ    31        *メニューの終了y座標
  8922. num_f:        equ    30        *1列のファイル数
  8923. file_sel:        *ファイルのセレクト
  8924.     * < work3 = 検索ファイル名(default='*.*')
  8925.     * X d0-d7,a0,a1,a2,a6
  8926.  
  8927.     IOCS    _OS_CUROF
  8928.     bsr    g_giji_clr
  8929. make_file_list:
  8930.     bsr    zen_clr2    *画面消去2
  8931.  
  8932.     moveq.l    #0,d6        *number of exist files
  8933.     moveq.l    #0,d2        *x
  8934.     moveq.l    #fsy,d3        *y
  8935.     move.l    #256,fn_buf
  8936.     move.l    #_data*256,fn_buf_size
  8937.  
  8938.     move.l    file_list(pc),-(sp)    *古いのは消去
  8939.     beq    @f
  8940.     DOS    _MFREE
  8941. @@:
  8942.     addq.w    #4,sp
  8943.  
  8944.     move.l    fn_buf_size(pc),-(sp)    *256 file 分のバッファ
  8945.     DOS    _MALLOC
  8946.     addq.w    #4,sp
  8947.     tst.l    d0
  8948.     bmi    mem_error
  8949.     move.l    d0,file_list
  8950.     movea.l    d0,a6
  8951.                     *カレントの変更
  8952.     movem.l    d0/a0-a1,-(sp)
  8953.     move.l    work3(pc),a0
  8954.     move.l    a0,a1
  8955.     tst.b    (a0)
  8956.     beq    end_chgcur
  8957.     cmpi.b    #':',1(a0)
  8958.     bne    @f
  8959.     move.b    (a0),d0
  8960.     andi.w    #$df,d0
  8961.     subi.b    #'A',d0
  8962.     move.w    d0,-(sp)
  8963.     DOS    _CHGDRV
  8964.     addq.w    #2,sp
  8965. @@:
  8966.     tst.b    (a0)+
  8967.     bne    @b
  8968. @@:
  8969.     move.b    -(a0),d0
  8970.     cmpi.b    #'\',d0
  8971.     beq    @f
  8972.     cmp.l    a1,a0
  8973.     bne    @b
  8974.     bra    end_chgcur
  8975. @@:
  8976.     move.b    1(a0),-(sp)
  8977.     clr.b    1(a0)
  8978.     pea    (a1)
  8979.     DOS    _CHDIR
  8980.     addq.w    #4,sp
  8981.     move.b    (sp)+,1(a0)
  8982. end_chgcur:
  8983.     movem.l    (sp)+,d0/a0-a1
  8984.  
  8985.     move.w    #%110000,-(sp)
  8986.     move.l    work3(pc),-(sp)
  8987.     pea    filbuf(pc)
  8988.     DOS    _FILES
  8989.     tst.l    d0
  8990.     bmi    exit_nf
  8991.     move.b    filbuf+30(pc),d0
  8992.     cmpi.b    #'.',d0
  8993.     bne    nm_trns
  8994. nfiles:
  8995.     DOS    _NFILES
  8996.     tst.l    d0
  8997.     bmi    exit_nf
  8998. nm_trns:
  8999.     lea    filbuf+30(pc),a1
  9000.     move.b    #$20,(a6)+    *0
  9001.     moveq.l    #18-1,d4    *18-1 filename(18)
  9002. nm_trns_lp:            *save file_name
  9003.     move.b    (a1)+,d0
  9004.     cmpi.b    #'.',d0
  9005.     beq    dmy_spc
  9006.     move.b    d0,(a6)+
  9007.     dbra    d4,nm_trns_lp
  9008. _get_peri:
  9009.     move.b    (a1)+,d0
  9010.     beq    kk_trns        *case:end
  9011.     cmpi.b    #'.',d0
  9012.     bne    _get_peri
  9013.     bra    kk_trns
  9014. dmy_spc:
  9015.     move.b    #$20,(a6)+
  9016.     dbra    d4,dmy_spc
  9017. kk_trns:
  9018.     move.b    d0,(a6)+    * '.'
  9019.     moveq.l    #3-1,d4        *拡張子(3)
  9020. kk_trns_lp:            *save 拡張子
  9021.     move.b    (a1)+,d0
  9022.     beq    dmy_spc2
  9023.     move.b    d0,(a6)+
  9024.     dbra    d4,kk_trns_lp
  9025.     move.b    (a1)+,d0
  9026.     bra    go_nf
  9027. dmy_spc2:
  9028.     move.b    #$20,(A6)+
  9029.     dbra    d4,dmy_spc2
  9030. go_nf:
  9031.     move.b    #$20,(a6)+        *dmy spc     23
  9032.     move.b    d0,(a6)+        *0        24
  9033.     move.b    filbuf+21(pc),(a6)+    *属性        25
  9034.     move.l    filbuf+26(pc),(a6)+    *save size    26,27,28,29
  9035.     move.b    d2,(a6)+        *x        30
  9036.     move.b    d3,(a6)+        *y        31
  9037.     move.l    filbuf+22(pc),(a6)+    *date        32,33,34,35
  9038.  
  9039.     addq.l    #1,d6            *num of files
  9040.  
  9041.     cmp.l    fn_buf(pc),d6
  9042.     bls    @f
  9043.     add.l    #256,fn_buf
  9044.     add.l    #_data*256,fn_buf_size
  9045.     move.l    fn_buf_size(pc),-(sp)
  9046.     move.l    file_list(pc),-(sp)
  9047.     DOS    _SETBLOCK
  9048.     addq.w    #8,sp
  9049.     tst.l    d0
  9050.     bmi    mem_error
  9051. @@:
  9052.     addq.b    #1,d3        *y=y+1
  9053.     cmpi.b    #fey+1,d3
  9054.     bne    go_nf1
  9055.     moveq.l    #fsy,d3
  9056.     addi.b    #48,d2        *x=x+29
  9057.     cmpi.b    #96,d2
  9058.     bcs    go_nf1
  9059.     moveq.l    #0,d2        *x=0
  9060. go_nf1:
  9061.     bra    nfiles        *go back to loop start
  9062. exit_nf:
  9063.     lea    10(sp),sp    *stack came back
  9064.     subq.l    #1,d6        *nf=nf-1
  9065.     scs    no_files
  9066.     move.l    d6,num_of_files
  9067.  
  9068.     moveq.l    #0,d7
  9069.     bsr    disp_cd            *カレントディレクトリ等の表示
  9070.  
  9071.     tst.b    no_files        *ファイル個数=0
  9072.     bne    _klp
  9073.     *select部
  9074.     movea.l    file_list(pc),a0    *file names base address
  9075.     move.l    sel_pnt(pc),d6        *select pointer
  9076.     moveq.l    #0,d0
  9077.     move.l    num_of_files(pc),d0
  9078.     cmp.l    d0,d6
  9079.     bls    @f
  9080.     move.l    d0,d6
  9081. @@:
  9082.     move.l    d6,d0
  9083.     divu    #_disp_max,d0
  9084.     bsr    prt_all_files        *ファイル初期表示
  9085.     move.l    d6,d5            *last select pointer
  9086.     bsr    disp_cur
  9087. _klp:
  9088.     move.l    d6,sel_pnt
  9089.     IOCS    _B_KEYINP
  9090.  
  9091.     cmpi.b    #'?',d0
  9092.     beq    input_fn2
  9093.  
  9094.     cmpi.b    #' ',d0
  9095.     beq    kiku
  9096.  
  9097.     move.b    d0,d1        *alphabet ?
  9098.     bsr    mk_capital1
  9099.     subi.b    #$41,d1
  9100.     bmi    number?
  9101.     cmpi.b    #26,d1
  9102.     bcs    chg_drv
  9103. number?:
  9104.     move.b    d0,d1        *number key?
  9105.     subi.b    #$30,d1
  9106.     bmi    not_number
  9107.     cmpi.b    #4,d1
  9108.     bls    chg_frq
  9109. not_number:
  9110.     cmpi.b    #$0d,d0
  9111.     beq    ret_ope        *CR!
  9112.  
  9113.     cmpi.b    #$1b,d0        *esc
  9114.     beq    quit_this
  9115.  
  9116.     cmpi.b    #3,d0        *break
  9117.     beq    quit_this
  9118.  
  9119.     tst.b    no_files    *ファイル個数=0
  9120.     bne    _klp
  9121.                 *cursor 移動チェック
  9122.     move.w    d0,d1
  9123.     lsr.w    #8,d1
  9124. *rllup??:            *roll up
  9125.     cmpi.w    #7*8+1,d1
  9126.     bne    rlldwn??
  9127.     move.l    d6,d0
  9128.     subi.l    #_disp_max,d0
  9129.     bmi    @f
  9130.     moveq.l    #-_disp_max,d0
  9131.     bra    move_cur
  9132. @@:
  9133.     move.l    d6,d0
  9134.     neg.l    d0
  9135.     bra    move_cur
  9136. rlldwn??:            *roll down
  9137.     cmpi.w    #7*8+0,d1
  9138.     bne    up??
  9139.     move.l    d6,d0
  9140.     addi.l    #_disp_max,d0
  9141.     cmp.l    num_of_files(pc),d0
  9142.     bhi    @f
  9143.     moveq.l    #_disp_max,d0
  9144.     bra    move_cur
  9145. @@:
  9146.     moveq.l    #0,d0
  9147.     move.l    num_of_files(pc),d0
  9148.     sub.l    d6,d0
  9149.     bra    move_cur
  9150. up??:
  9151.     cmpi.w    #7*8+4,d1
  9152.     bne    down??
  9153. _up?:
  9154.     tst.l    d6
  9155.     beq    _nxt_k
  9156.     moveq.l    #-1,d0
  9157.     bra    move_cur
  9158. down??:
  9159.     cmpi.b    #7*8+6,d1
  9160.     bne    left??
  9161. _dwn?:
  9162.     cmp.l    num_of_files(pc),d6
  9163.     beq    _nxt_k
  9164.     moveq.l    #1,d0
  9165.     bra    move_cur
  9166. left??:
  9167.     cmpi.b    #7*8+3,d1
  9168.     bne    right??
  9169.     move.l    d6,d0
  9170.     subi.l    #num_f,d0
  9171.     bmi    @f
  9172.     moveq.l    #-num_f,d0
  9173.     bra    move_cur
  9174. @@:
  9175.     move.l    d6,d0
  9176.     neg.l    d0
  9177.     bra    move_cur
  9178. right??:
  9179.     cmpi.b    #7*8+5,d1
  9180.     bne    _nxt_k
  9181.     move.l    d6,d0
  9182.     addi.l    #num_f,d0
  9183.     cmp.l    num_of_files(pc),d0
  9184.     bhi    @f
  9185.     moveq.l    #num_f,d0
  9186.     bra    move_cur
  9187. @@:
  9188.     moveq.l    #0,d0
  9189.     move.l    num_of_files(pc),d0
  9190.     sub.l    d6,d0
  9191.     bra    move_cur
  9192. _nxt_k:
  9193.     cmpi.b    #2*8+0,d1    *tab
  9194.     beq    tab_ope
  9195.  
  9196.     IOCS    _B_SFTSNS
  9197.     btst.l    #0,d0
  9198.     bne    mute_pcm
  9199.  
  9200.     bra    _klp
  9201.  
  9202. move_cur:
  9203.     add.l    d0,d6
  9204. hot_start:
  9205. do_cur:
  9206.     bsr    del_cur
  9207.     bsr    disp_cur
  9208.     move.l    d6,d5
  9209.     bra    _klp
  9210. del_cur:
  9211.     move.w    d5,d0
  9212.     mulu    #_data,d0
  9213.     lea    (a0,d0.l),a2    *last
  9214.     moveq.l    #0,d7
  9215.     bra    prt_file
  9216. disp_cur:
  9217.     move.l    d6,d0
  9218.     divu    #_disp_max,d0
  9219.     move.l    d5,d1
  9220.     divu    #_disp_max,d1
  9221.     cmp.w    d0,d1
  9222.     beq    @f
  9223.     bsr    prt_all_files
  9224. @@:
  9225.     move.w    d6,d0
  9226.     mulu    #_data,d0
  9227.     lea    (a0,d0.l),a2    *new
  9228.     moveq.l    #%1000,d7
  9229.     bra    prt_file
  9230.  
  9231. quit_this:    *ファイルセレクト終了
  9232.     suba.l    a1,a1        *a1=0
  9233.     rts
  9234. mute_pcm:
  9235.     moveq.l    #0,d1
  9236.     IOCS    _ADPCMMOD    *adpcm stop
  9237.     bra    _klp
  9238. chg_frq:
  9239.     move.b    d1,sampling_rate
  9240.     bra    _klp
  9241. chg_drv:
  9242.     andi.w    #$00ff,d1
  9243.     addq.w    #1,d1
  9244.     move.w    d1,-(sp)
  9245.     DOS    _DRVCTRL
  9246.     addq.w    #2,sp
  9247.     btst.l    #1,d0
  9248.     beq    _klp        *not ready
  9249.  
  9250.     subq.w    #1,d1
  9251.     move.w    d1,-(sp)
  9252.     DOS    _CHGDRV
  9253.     addq.w    #2,sp
  9254.  
  9255.     clr.l    oya_kai
  9256.     clr.l    sel_pnt
  9257.  
  9258.     move.l    #nameptr,work3
  9259.  
  9260.     bra    make_file_list
  9261.  
  9262. dmy_lp:
  9263.     subq.l    #1,d0
  9264.     bne    dmy_lp
  9265.     rts
  9266.  
  9267. ret_ope:    *return keyが押された
  9268.     * > a1=file name pointer
  9269.     * > d1=size
  9270.     bsr    del_cur        *erase cursor
  9271.     move.w    d6,d0
  9272.     mulu    #_data,d0
  9273.     lea    (a0,d0.l),a2
  9274.     btst.b    #4,25(a2)
  9275.     bne    dir_chg
  9276.     lea    1(a2),a1
  9277.     move.l    26(a2),d1
  9278.     movem.l    d0-d7/a0-a6,reg_buff
  9279.     rts
  9280. dir_chg:
  9281.     pea    1(a2)
  9282.     DOS    _CHDIR
  9283.     addq.w    #4,sp
  9284.     cmpi.b    #'.',19(a2)
  9285.     bne    @f
  9286.     cmpi.b    #'.',20(a2)
  9287.     bne    @f
  9288.     move.l    oya_kai(pc),sel_pnt
  9289.     clr.l    oya_kai
  9290.     bra    make_file_list
  9291. @@:
  9292.     move.l    d6,oya_kai
  9293.     clr.l    sel_pnt
  9294.     bra    make_file_list
  9295. tab_ope:    *tab keyが押された
  9296.     bsr    del_cur        *erase cursor
  9297.     move.w    d6,d0
  9298.     mulu    #_data,d0
  9299.     lea    (a0,d0.l),a2
  9300. *    btst.b    #4,25(a2)
  9301. *    bne    dir_chg
  9302.     cmpi.b    #'.',19(a2)    *!!!
  9303.     bne    @f        *!!!
  9304.     cmpi.b    #'.',20(a2)    *!!!
  9305.     beq    dir_chg        *!!!
  9306. @@:
  9307.     moveq.l    #0,d6
  9308.     bra    do_cur
  9309.  
  9310. kiku:        *SPACE keyが押された
  9311.     * > a1=file name pointer
  9312.     * > d1=size
  9313.     bsr    del_cur        *erase cursor
  9314.     move.w    d6,d0
  9315.     mulu    #_data,d0
  9316.     lea    (a0,d0.l),a2
  9317.     btst.b    #4,25(a2)
  9318.     bne    do_cur        *ディレクトリ名は駄目
  9319.     lea    1(a2),a1
  9320.     move.l    26(a2),d1
  9321.     bsr    ext_chk
  9322.     bsr    saisei
  9323.     bra    do_cur
  9324.  
  9325. input_fn2:
  9326.     * > use_fm=1 file menuを使った
  9327.     * > a1=file name addr.
  9328.     * > a1=0 then cansel
  9329.     moveq.l    #0,d1
  9330.     moveq.l    #1,d2
  9331.     IOCS    _B_LOCATE
  9332.     IOCS    _B_ERA_ST
  9333.     display2    input_fn2_mes,%0111,0,1,16
  9334.     moveq.l    #16,d1
  9335.     moveq.l    #1,d2
  9336.     IOCS    _B_LOCATE
  9337.     IOCS    _OS_CURON
  9338.  
  9339.     lea    input_buffer(pc),a1
  9340.     move.b    #91,(a1)    *文字数
  9341.     pea    (a1)
  9342.     DOS    _GETS        *一行入力
  9343.     addq.w    #4,sp
  9344.  
  9345.     addq.w    #2,a1        *chr data buffer
  9346.     IOCS    _OS_CUROF
  9347.  
  9348.     move.l    #nameptr,work3
  9349.     cmpi.b    #$20,(a1)
  9350.     bls    make_file_list
  9351.     move.l    a1,work3
  9352.     bsr    check_wild
  9353.     bmi    make_file_list
  9354.     movem.l    d0-d7/a0-a6,reg_buff
  9355.     rts
  9356.  
  9357. prt_all_files:
  9358.     * < d0.w=page
  9359.     movem.l    d0-d7/a0-a2,-(sp)
  9360.     bsr    zen_clr3        *画面消去2
  9361.     mulu    #_disp_max,d0
  9362.     move.l    d0,d1            *page*60
  9363.     mulu    #_data,d0
  9364.     movea.l    file_list(pc),a2    *file names
  9365.     add.l    d0,a2
  9366.     move.l    num_of_files(pc),d6
  9367.     tst.b    no_files        *file個数=0?
  9368.     bne    @f
  9369.     sub.l    d1,d6
  9370.     cmpi.l    #_disp_max-1,d6
  9371.     bls    print_fn_lp
  9372.     moveq.l    #_disp_max-1,d6
  9373. print_fn_lp:
  9374.     bsr    prt_file
  9375.     lea    _data(a2),a2
  9376.     dbra    d6,print_fn_lp
  9377. @@:
  9378.     movem.l    (sp)+,d0-d7/a0-a2
  9379.     rts
  9380.  
  9381. prt_file:
  9382.     * < a2=file pointer
  9383.     * < d7=attribute
  9384.     * < d0=offset
  9385.     * X d0,d1,d2,d3,d4 a1
  9386.     btst.b    #4,25(a2)    *atr
  9387.     beq    set_white
  9388.     moveq.l    #%0010,d1
  9389.     bra    or_rev
  9390. set_white:
  9391.     moveq.l    #%0011,d1    *atr
  9392. or_rev:
  9393.     or.b    d7,d1
  9394.     lea    (a2),a1
  9395.     moveq.l    #23,d4        *length
  9396.     move.b    30(a2),d2
  9397.     move.b    31(a2),d3    *get x&y
  9398.     IOCS    _B_PUTMES
  9399.  
  9400.     btst.b    #4,25(a2)    *atr
  9401.     bne    case_dir    *ディレクトリ
  9402.  
  9403.     move.l    26(a2),d0    *size
  9404.     bsr    num_to_str
  9405.     move.w    #$2000,suji+10
  9406.     lea    suji+2(pc),a1
  9407.     moveq.l    #9-1,d4
  9408.     IOCS    _B_PUTMES
  9409.     bra    _year
  9410. case_dir:
  9411.     subq.b    #1,d2
  9412.     lea    _dir(pc),a1
  9413.     moveq.l    #10-1,d4
  9414.     moveq.l    #%0010,d1
  9415.     or.b    d7,d1
  9416.     IOCS    _B_PUTMES
  9417. _year:
  9418.     moveq.l    #0,d0
  9419.     move.b    34(a2),d0
  9420.     lsr.b    d0
  9421.     add.b    #80,d0
  9422.     bsr    num_to_str
  9423.     lea    suji+8(pc),a1
  9424.     move.w    #$2e_00,2(a1)
  9425.     moveq.l    #3-1,d4
  9426.     IOCS    _B_PUTMES    *年
  9427.  
  9428.     moveq.l    #0,d0
  9429.     move.w    34(a2),d0
  9430.     lsr.w    #5,d0
  9431.     andi.w    #15,d0
  9432.     bsr    _num_to_str
  9433.     lea    suji+8(pc),a1
  9434.     move.w    #$2e_00,2(a1)
  9435.     moveq.l    #3-1,d4
  9436.     IOCS    _B_PUTMES    *月
  9437.  
  9438.     moveq.l    #0,d0
  9439.     move.w    34(a2),d0
  9440.     andi.w    #31,d0
  9441.     bsr    _num_to_str
  9442.     lea    suji+8(pc),a1
  9443.     moveq.l    #3-1,d4
  9444.     IOCS    _B_PUTMES    *日
  9445.  
  9446.     moveq.l    #0,d0
  9447.     move.b    32(a2),d0
  9448.     lsr.b    #3,d0
  9449.     andi.w    #31,d0
  9450.     bsr    _num_to_str
  9451.     lea    suji+8(pc),a1
  9452.     move.w    #$3a_00,2(a1)
  9453.     moveq.l    #3-1,d4
  9454.     IOCS    _B_PUTMES    *時
  9455.  
  9456.     moveq.l    #0,d0
  9457.     move.w    32(a2),d0
  9458.     lsr.w    #5,d0
  9459.     andi.w    #63,d0
  9460.     bsr    _num_to_str
  9461.     lea    suji+8(pc),a1
  9462. *    move.w    #$27_00,2(a1)
  9463.     moveq.l    #3-1,d4
  9464.     IOCS    _B_PUTMES    *分
  9465.  
  9466. *    moveq.l    #0,d0
  9467. *    move.b    33(a2),d0
  9468. *    andi.w    #31,d0
  9469. *    add.b    d0,d0
  9470. *    bsr    num_to_str
  9471. *    lea    suji+8(pc),a1
  9472. *    moveq.l    #3-1,d4
  9473. *    IOCS    _B_PUTMES    *秒
  9474. ext_prt_fl:
  9475.     rts
  9476.  
  9477. disp_cd:
  9478.     DOS    _CURDRV
  9479.     move.w    d0,d1
  9480.     add.b    #$41,d0
  9481.     move.b    d0,cdr_str
  9482.  
  9483.     lea    pathbf(pc),a1
  9484.     moveq.l    #91,d0
  9485. spc_lpp:
  9486.     move.b    #$20,(a1)+
  9487.     dbra    d0,spc_lpp
  9488.  
  9489.     addq.w    #1,d1
  9490.     pea    pathbf(pc)
  9491.     move.w    d1,-(sp)
  9492.     DOS    _CURDIR
  9493.     addq.w    #6,sp
  9494.  
  9495.     display    pathbf-3,%0110,0,1,67
  9496.     rts
  9497. loop:
  9498.     bra    loop
  9499.  
  9500. clr_em_area:
  9501.     movem.l    d0-d2,-(sp)
  9502.     moveq.l    #0,d1
  9503.     moveq.l    #15,d2
  9504.     IOCS    _B_LOCATE
  9505.     moveq.l    #2,d1
  9506.     IOCS    _B_ERA_ST    *メッセージエリアの消去
  9507.     movem.l    (sp)+,d0-d2
  9508.     rts
  9509. print_em:
  9510.     * > d1=minus then error
  9511.     movem.l    d0-d4/a0-a1,-(sp)
  9512.     lea    work(pc),a1
  9513.     tst.l    mm_error-work(a1)
  9514.     bmi    mem_error
  9515.     tst.l    fo_error-work(a1)
  9516.     bmi    file_error
  9517.     tst.l    rd_error-work(a1)
  9518.     bmi    _rd_error
  9519.     tst.l    wr_error-work(a1)
  9520.     bmi    _wr_error
  9521.     tst.l    disk_full-work(a1)
  9522.     bmi    _disk_full
  9523.     moveq.l    #0,d0
  9524.     movem.l    (sp)+,d0-d4/a0-a1
  9525.     rts
  9526. err_exit:
  9527.     moveq.l    #0,d0
  9528.     lea    work(pc),a1
  9529.     move.l    d0,mm_error-work(a1)
  9530.     move.l    d0,fo_error-work(a1)
  9531.     move.l    d0,rd_error-work(a1)
  9532.     move.l    d0,wr_error-work(a1)
  9533.     move.l    d0,disk_full-work(a1)
  9534.     IOCS    _OS_CUROF
  9535.     bsr    get_spc
  9536.     bsr    put_pt
  9537.     moveq.l    #-1,d0
  9538.     movem.l    (sp)+,d0-d4/a0-a1
  9539.     rts
  9540. get_spc:
  9541.     DOS    _INKEY
  9542.     cmpi.b    #$20,d0
  9543.     beq    bye_gs
  9544.     cmpi.b    #$0d,d0
  9545.     beq    bye_gs
  9546.     bra    get_spc
  9547. bye_gs:
  9548.     rts
  9549.  
  9550. mk_capital0:            *小文字→大文字(英字以外の場合はそのままthrough out)
  9551.     * < d0.b=letter chr
  9552.     cmpi.b    #'a',d0
  9553.     bcs    exit_mkcptl
  9554.     cmpi.b    #'z',d0
  9555.     bhi    exit_mkcptl
  9556.     andi.w    #$df,d0        *わざと.w
  9557. exit_mkcptl:
  9558.     rts
  9559.  
  9560. mk_capital1:            *小文字→大文字(英字以外の場合はそのままthrough out)
  9561.     * < d1.b=letter chr
  9562.     cmpi.b    #'a',d1
  9563.     bcs    exit_mkcptl
  9564.     cmpi.b    #'z',d1
  9565.     bhi    exit_mkcptl
  9566.     andi.w    #$df,d1        *わざと.w
  9567.     rts
  9568.  
  9569. init_kbuf:
  9570.     move.l    d0,-(sp)
  9571.     clr.w    -(sp)
  9572.     DOS    _KFLUSH
  9573.     addq.w    #2,sp
  9574.     move.l    (sp)+,d0
  9575.     rts
  9576.  
  9577. erase_line    macro    y
  9578.     moveq.l    #0,d1
  9579.     moveq.l    #y,d2
  9580.     IOCS    _B_LOCATE
  9581.     moveq.l    #2,d1
  9582.     IOCS    _B_ERA_ST
  9583.     endm
  9584.  
  9585. mem_error:
  9586.     bsr    get_pt
  9587.     erase_line    15
  9588.     display2    mem_er_mes,%1111,41,15,13
  9589.     clr.l    mm_error
  9590.     bra    err_exit
  9591. file_error:
  9592.     bsr    get_pt
  9593.     erase_line    15
  9594.     display2    fop_er_mes,%1111,40,15,15
  9595.     bra    err_exit
  9596. _rd_error:
  9597.     bsr    get_pt
  9598.     erase_line    15
  9599.     display2    rd_er_mes,%1111,43,15,10
  9600.     bra    err_exit
  9601. _wr_error:
  9602.     bsr    get_pt
  9603.     erase_line    15
  9604.     display2    wr_er_mes,%1111,43,15,11
  9605.     bra    err_exit
  9606. _disk_full:
  9607.     bsr    get_pt
  9608.     erase_line    15
  9609.     display2    dsk_f_mes,%1111,44,15,9
  9610.     bra    err_exit
  9611. get_pt:                *エラーメッセージの背景を待避
  9612.     movem.l    d0-d1/a0-a1,-(sp)
  9613.     pea    96*16*2.w
  9614.     DOS    _MALLOC
  9615.     addq.w    #4,sp
  9616.     move.l    d0,a0
  9617.     move.l    d0,get_pt_buf
  9618.     lea    $e00000+$80*16*15,a1
  9619.     moveq.l    #15,d1
  9620. get_pt_lp:
  9621.     moveq.l    #24-1,d0
  9622. get_pt_lp_:
  9623.     move.l    (a1)+,(a0)+
  9624.     dbra    d0,get_pt_lp_
  9625.     lea    32(a1),a1
  9626.     dbra    d1,get_pt_lp
  9627.     lea    $e20000+$80*16*15,a1
  9628.     moveq.l    #15,d1
  9629. get_pt_lp2:
  9630.     moveq.l    #24-1,d0
  9631. get_pt_lp2_:
  9632.     move.l    (a1)+,(a0)+
  9633.     dbra    d0,get_pt_lp2_
  9634.     lea    32(a1),a1
  9635.     dbra    d1,get_pt_lp2
  9636.     movem.l    (sp)+,d0-d1/a0-a1
  9637.     rts
  9638. put_pt:                *エラーメッセージの背景を復活
  9639.     movem.l    d0-d1/a0-a1,-(sp)
  9640.     movea.l    get_pt_buf(pc),a0
  9641.     lea    $e00000+$80*16*15,a1
  9642.     moveq.l    #15,d1
  9643. put_pt_lp:
  9644.     moveq.l    #24-1,d0
  9645. put_pt_lp_:
  9646.     move.l    (a0)+,(a1)+
  9647.     dbra    d0,put_pt_lp_
  9648.     lea    32(a1),a1
  9649.     dbra    d1,put_pt_lp
  9650.     lea    $e20000+$80*16*15,a1
  9651.     moveq.l    #15,d1
  9652. put_pt_lp2:
  9653.     moveq.l    #24-1,d0
  9654. put_pt_lp2_:
  9655.     move.l    (a0)+,(a1)+
  9656.     dbra    d0,put_pt_lp2_
  9657.     lea    32(a1),a1
  9658.     dbra    d1,put_pt_lp2
  9659.  
  9660.     move.l    get_pt_buf(pc),-(sp)
  9661.     DOS    _MFREE
  9662.     addq.w    #4,sp
  9663.     movem.l    (sp)+,d0-d1/a0-a1
  9664.     rts
  9665. get_pt1:
  9666.     movem.l    d0-d1/a0-a1,-(sp)
  9667.     pea    96*16*2.w
  9668.     DOS    _MALLOC
  9669.     addq.w    #4,sp
  9670.     move.l    d0,a0
  9671.     move.l    d0,get_pt_buf1
  9672.     lea    $e00000+$80*16*15,a1
  9673.     moveq.l    #15,d1
  9674. get_pt_lp1:
  9675.     moveq.l    #24-1,d0
  9676. get_pt_lp_1:
  9677.     move.l    (a1)+,(a0)+
  9678.     dbra    d0,get_pt_lp_1
  9679.     lea    32(a1),a1
  9680.     dbra    d1,get_pt_lp1
  9681.     lea    $e20000+$80*16*15,a1
  9682.     moveq.l    #15,d1
  9683. get_pt_lp21:
  9684.     moveq.l    #24-1,d0
  9685. get_pt_lp2_1:
  9686.     move.l    (a1)+,(a0)+
  9687.     dbra    d0,get_pt_lp2_1
  9688.     lea    32(a1),a1
  9689.     dbra    d1,get_pt_lp21
  9690.     movem.l    (sp)+,d0-d1/a0-a1
  9691.     rts
  9692. put_pt1:
  9693.     movem.l    d0-d1/a0-a1,-(sp)
  9694.     movea.l    get_pt_buf1(pc),a0
  9695.     lea    $e00000+$80*16*15,a1
  9696.     moveq.l    #15,d1
  9697. put_pt_lp1:
  9698.     moveq.l    #24-1,d0
  9699. put_pt_lp_1:
  9700.     move.l    (a0)+,(a1)+
  9701.     dbra    d0,put_pt_lp_1
  9702.     lea    32(a1),a1
  9703.     dbra    d1,put_pt_lp1
  9704.     lea    $e20000+$80*16*15,a1
  9705.     moveq.l    #15,d1
  9706. put_pt_lp21:
  9707.     moveq.l    #24-1,d0
  9708. put_pt_lp2_1:
  9709.     move.l    (a0)+,(a1)+
  9710.     dbra    d0,put_pt_lp2_1
  9711.     lea    32(a1),a1
  9712.     dbra    d1,put_pt_lp21
  9713.  
  9714.     move.l    get_pt_buf1(pc),-(sp)
  9715.     DOS    _MFREE
  9716.     addq.w    #4,sp
  9717.     movem.l    (sp)+,d0-d1/a0-a1
  9718.     rts
  9719.  
  9720. get_name:            *get file name or switches
  9721.     *< a2=command line
  9722.     *> a2=point next
  9723.     movem.l    d0/a3,-(sp)
  9724.     lea    input_buffer(pc),a3
  9725. loop1:
  9726.     move.b    (a2)+,d0
  9727.     beq    ext_nm
  9728.     cmpi.b    #' ',d0
  9729.     bls    loop1        *skip space
  9730.  
  9731.     subq.w    #1,a2
  9732. loop2:
  9733.     move.b    (a2)+,d0
  9734.     cmpi.b    #' ',d0
  9735.     bls    ext_nm
  9736.     move.b    d0,(a3)+
  9737.     bra    loop2
  9738. ext_nm:
  9739.     subq.w    #1,a2
  9740.     clr.b   (a3)
  9741.     movem.l    (sp)+,d0/a3
  9742.     rts
  9743. sv_fn:                *ファイルネームを定位置へ
  9744.     movem.l    d0/a0-a1,-(sp)
  9745.     lea    input_buffer(pc),a0
  9746.     tst.b    fn1
  9747.     bne    chk_fn2?
  9748.     lea    fn1(pc),a1
  9749.     bsr    check_wild2
  9750.     bpl    do_sv_fn
  9751.     lea    wfn1(pc),a1
  9752.     move.b    #1,wild_mode
  9753.     st    fn1
  9754.     bra    do_sv_fn
  9755. chk_fn2?:
  9756.     tst.b    fn2
  9757.     bne    chk_fn3?
  9758.     lea    fn2(pc),a1
  9759.     bsr    check_wild2
  9760.     bpl    do_sv_fn
  9761.     ori.b    #2,wild_mode
  9762.     lea    wfn2(pc),a1
  9763.     st    fn2
  9764.     bra    do_sv_fn
  9765. chk_fn3?:
  9766.     tst.b    fn3
  9767.     bne    bye_sv_fn
  9768.     lea    fn3(pc),a1
  9769.     bsr    check_wild2
  9770.     bpl    do_sv_fn
  9771.     ori.b    #4,wild_mode
  9772.     lea    wfn3(pc),a1
  9773.     st    fn3
  9774. do_sv_fn:
  9775.     move.b    (a0)+,(a1)+
  9776.     bne    do_sv_fn
  9777.     moveq.l    #0,d0
  9778. bye_sv_fn:
  9779.     movem.l    (sp)+,d0/a0-a1
  9780.     rts
  9781.  
  9782. check_wild2:            *ワイルドカードかどうか
  9783.     * > minus = wild / zero = not wild
  9784.     * - ALL
  9785.     movem.l    d0/a0,-(sp)
  9786. cw_lp2:
  9787.     move.b    (a0)+,d0
  9788.     beq    bye_cw_no2    *file name end
  9789.     cmpi.b    #'*',d0
  9790.     beq    bye_cw_yes2
  9791.     cmpi.b    #'?',d0
  9792.     bne    cw_lp2
  9793. bye_cw_yes2:
  9794.     moveq.l    #-1,d0
  9795.     movem.l    (sp)+,d0/a0
  9796.     rts
  9797. bye_cw_no2:
  9798.     moveq.l    #0,d0
  9799.     movem.l    (sp)+,d0/a0
  9800.     rts
  9801.  
  9802. fn_chk_p16:
  9803.     lea    fn1(pc),a0
  9804.     lea    fn1_p16(pc),a1
  9805.     bsr    do_fcp16
  9806.     lea    fn2(pc),a0
  9807.     lea    fn2_p16(pc),a1
  9808.     bsr    do_fcp16
  9809.     lea    fn3(pc),a0
  9810.     lea    fn3_p16(pc),a1
  9811. do_fcp16:
  9812.     move.b    (a0)+,d0
  9813.     beq    err_exit_fcp16
  9814.     cmpi.b    #'.',d0
  9815.     bne    do_fcp16
  9816.     move.b    (a0)+,d0
  9817.     bsr    mk_capital0
  9818.     cmpi.b    #'P',d0
  9819.     bne    err_exit_fcp16
  9820.     move.b    (a0)+,d0
  9821.     cmpi.b    #'1',d0
  9822.     bne    err_exit_fcp16
  9823.     move.b    (a0)+,d0
  9824.     cmpi.b    #'6',d0
  9825.     bne    err_exit_fcp16
  9826.     st.b    (a1)
  9827.     bra    @f
  9828. err_exit_fcp16:
  9829.     clr.b    (a1)
  9830. @@:
  9831.     rts
  9832.  
  9833. go_command:            *フィルター機能の分岐
  9834.     bsr    val_init    *数値の初期化
  9835.     bsr    fn_chk_p16    *fnが.p16かどうかチェック
  9836.     move.w    #RTS,print_em    *rtsをエラーメッセージ表示ルーチンに書きこんじゃう
  9837.     lea    pitch_cmd(pc),a5
  9838.     lea    volume_cmd(pc),a6
  9839.  
  9840.     tst.l    truncate_cmd-pitch_cmd(a5)    *切り出し(hidden)
  9841.     bne    _truncate
  9842.     tst.b    _4_cmd-pitch_cmd(a5)        *4段階セーブ
  9843.     bne    _4_com
  9844.     tst.b    conv_atop_cmd-pitch_cmd(a5)    *adpcm to pcm
  9845.     bne    conv_atop
  9846.     tst.b    conv_ptoa_cmd-pitch_cmd(a5)    *pcm to adpcm
  9847.     bne    conv_ptoa
  9848.  
  9849.     tst.b    (a5)
  9850.     bne    pv_com
  9851.     tst.w    (a6)
  9852.     bne    pv_com
  9853.     tst.b    1(a5)
  9854.     bne    pv_com
  9855.     tst.w    2(a6)
  9856.     bne    pv_com        *2セットチェックする
  9857.     tst.b    mix_cmd-pitch_cmd(a5)
  9858.     bne    pv_com
  9859.  
  9860.     bra    print_hlp
  9861.  
  9862. print_em2:
  9863.     * > d1=minus then error
  9864.     move.l    d0,-(sp)
  9865.     pea    back_print_em2(pc)
  9866.     tst.l    mm_error
  9867.     bmi    outm_error
  9868.     tst.l    fo_error
  9869.     bmi    fop_er
  9870.     tst.l    rd_error
  9871.     bmi    read_error
  9872.     tst.l    wr_error
  9873.     bmi    write_error
  9874.     tst.l    disk_full
  9875.     bmi    disk_full_error
  9876.     addq.w    #4,sp
  9877.     move.l    (sp)+,d0
  9878.     move    #0,ccr
  9879.     rts
  9880. back_print_em2:
  9881.     moveq.l    #-1,d0
  9882.     move.l    (sp)+,d0
  9883.     ori.b    #%01000,ccr
  9884.     rts
  9885.  
  9886. conv_atop:            *convert adpcm to pcm    !!!
  9887.     bsr    disp_proc
  9888.     move.b    fn1(pc),d0
  9889.     and.b    fn2(pc),d0
  9890.     beq    fn_error    *ファイルネームが揃ってない…
  9891.  
  9892.     lea    fn1(pc),a1
  9893.     bsr    read_data
  9894.     bsr    print_em2
  9895.     bmi    bye_bye
  9896.     move.l    d1,size1
  9897.     move.l    d2,address1
  9898.  
  9899.     lsl.l    #3,d1        *adpcm sizeの8倍のエリアを確保(for pcm data)
  9900.     move.l    d1,-(sp)
  9901.     DOS    _MALLOC
  9902.     addq.w    #4,sp
  9903.     move.l    d0,mm_error
  9904.     bsr    print_em2
  9905.     bmi    bye_bye
  9906.     move.l    d0,buffer1
  9907.     move.l    d0,a1        *pcm buffer
  9908.     move.l    d2,a0        *adpcm buffer
  9909.     move.l    size1(pc),d0    *adpcm size
  9910.     moveq.l    #0,d1
  9911.     move.b    (a5),d1
  9912.     add.b    #12,d1
  9913.     moveq.l    #0,d6
  9914.     move.w    (a6),d6
  9915.     bne    catop1
  9916.     moveq.l    #100,d6        *0は100にする
  9917. catop1:
  9918.     tst.b    _8bit_pcm
  9919.     beq    @f
  9920.     bsr    adpcm_to_8pcm
  9921.     bra    catop2
  9922. @@:
  9923.     bsr    adpcm_to_pcm    *pcm変換
  9924. catop2:
  9925.     move.l    a1,d1        *save size
  9926.     lea    fn2(pc),a1        *destination file name
  9927.     movea.l    buffer1(pc),a2
  9928.     bsr    write_data
  9929.     bsr    print_em2
  9930.     bmi    bye_bye
  9931.     bra    mission_complete
  9932.  
  9933. conv_ptoa:            *convert pcm to adpcm
  9934.     bsr    disp_proc
  9935.     move.b    fn1(pc),d0
  9936.     and.b    fn2(pc),d0
  9937.     beq    fn_error    *ファイルネームがない
  9938.     lea    fn1(pc),a1
  9939.     bsr    read_data
  9940.     bsr    print_em2
  9941.     bmi    bye_bye
  9942.     lsr.l    #2,d1
  9943.     move.l    d1,size1    *adpcm size
  9944.     move.l    d2,buffer1
  9945.  
  9946.     move.l    size1(pc),d0
  9947.     add.l    d0,d0        *d0=data count
  9948.     move.l    buffer1(pc),a1
  9949.     moveq.l    #0,d6
  9950.     move.w    (a6),d6
  9951.     beq     cpta1        *0は100なので無視
  9952.     bsr    do_level
  9953. cpta1:
  9954.     tst.b    (a5)        *pitch shiftはないケース
  9955.     beq    cpta2
  9956.  
  9957.     move.l    size1(pc),d0
  9958.     lsl.l    #3,d0        *一応8倍の大きさを取る
  9959.     move.l    d0,-(sp)
  9960.     DOS    _MALLOC
  9961.     addq.w    #4,sp
  9962.     move.l    d0,mm_error
  9963.     bsr    print_em2
  9964.     bmi    bye_bye
  9965.     move.l    d0,buffer3
  9966.     move.l    d0,a1        *destination
  9967.     move.l    buffer1(pc),a2    *source
  9968.     move.l    size1(pc),d0
  9969.     add.l    d0,d0        *d0=data count
  9970.     move.b    (a5),d6
  9971.     ext.w    d6
  9972.     add.w    #12,d6
  9973.     add.w    d6,d6
  9974.     cmpi.b    #$18,d6
  9975.     bcs    cpta_shift_down    *ピッチを下げるケース
  9976.                 *ピッチを上げるケース
  9977.     lea    frq_tbl(pc),a5
  9978.     move.w    -26(a5,d6.w),d4
  9979.     move.b    #1,d6        *set switch
  9980.     bra    cpta_bsr_do_pitch
  9981. cpta_shift_down:
  9982.     lea    frq_tbl2(pc),a5
  9983.     move.w    (a5,d6.w),d4
  9984.     st    d6        *set switch
  9985. cpta_bsr_do_pitch:
  9986.     bsr    do_pitch    *ピッチチェンジ
  9987.     bsr    mfree_pcm_a    *もういらない
  9988.     move.l    a1,d0
  9989.     lsr.l    #2,d0
  9990.     move.l    d0,size1
  9991.     move.l    buffer3(pc),buffer1
  9992. cpta2:
  9993.     bsr    make_adpcm_a
  9994.     bsr    print_em2
  9995.     bmi    bye_bye
  9996.     lea    fn2(pc),a1
  9997.     move.l    size1(pc),d1
  9998.     move.l    address1(pc),a2
  9999.     bsr    write_data
  10000.     bsr    print_em2
  10001.     bmi    bye_bye
  10002.     bra    mission_complete
  10003.  
  10004. _truncate:            *波形切り出し
  10005.     bsr    disp_proc
  10006.     move.b    fn1(pc),d0
  10007.     and.b    fn2(pc),d0
  10008.     beq    fn_error    *ファイルネームが揃ってない…
  10009.  
  10010.     lea    fn1(pc),a1
  10011.     bsr    read_data
  10012.     bsr    print_em2
  10013.     bmi    bye_bye
  10014.     move.l    d1,size1
  10015.     tst.b    fn1_p16
  10016.     bpl    @f
  10017.     move.l    d2,buffer1
  10018.     bra    go__tr__
  10019. @@:
  10020.     move.l    d2,address1
  10021.  
  10022.     bsr    make_pcm_a
  10023.     bsr    mfree_adpcm_a
  10024. go__tr__:
  10025.     move.l    size1(pc),d2    *d2=size
  10026.     lsl.l    #2,d2
  10027.     movea.l    buffer1(pc),a1    *base data addr.
  10028.     move.l    a1,buffer2    *非常用
  10029.     lea    -2(a1,d2.l),a2    *a2=end addr
  10030.     move.l    a2,size2    *一時的にこうしておく
  10031. get_hd_lp_2:
  10032.     move.w    (a1)+,d0
  10033.     bpl    @f
  10034.     neg.w    d0
  10035. @@:
  10036.     cmpa.l    a1,a2
  10037.     bls    exit_qt2    *最後まで来てしまった…
  10038.     cmp.w    truncate_cmd(pc),d0
  10039.     bls    get_hd_lp_2
  10040.     subq.w    #2,a1
  10041.     move.l    a1,buffer2    *save start
  10042.     addq.w    #2,a1
  10043. get_tl_2:
  10044.     moveq.l    #0,d1        *found counter
  10045. get_tl_lp_2:
  10046.     move.w    (a1)+,d0
  10047.     bpl    @f
  10048.     neg.w    d0
  10049. @@:
  10050.     cmpa.l    a1,a2
  10051.     bls    exit_qt2
  10052.     cmp.w    truncate_cmd(pc),d0
  10053.     bhi    get_tl_lp_2
  10054.     move.l    a1,work1
  10055. get_tl_lp1_2:
  10056.     addq.l    #1,d1        *find=find+1
  10057.     move.w    (a1)+,d0
  10058.     bpl    @f
  10059.     neg.w    d0
  10060. @@:
  10061.     cmpa.l    a1,a2
  10062.     bls    exit_qt2
  10063.     cmp.w    truncate_cmd(pc),d0
  10064.     bhi    get_tl_2
  10065.     cmpi.b    #meyasu*2,d1
  10066.     bcs    get_tl_lp1_2
  10067.     move.l    work1(pc),d0
  10068.     subq.l    #2,d0
  10069.     move.l    d0,size2
  10070. exit_qt2:
  10071.     move.l    size2(pc),d0    *サイズの計算
  10072.     addq.l    #2,d0
  10073.     movea.l    buffer2(pc),a2
  10074.     sub.l    a2,d0        *d0=pcm data size
  10075.     tst.b    fn2_p16
  10076.     bpl    @f
  10077.     move.l    d0,d1        *size
  10078.     bra    do_wrt__tr
  10079. @@:
  10080.     lsr.l    #2,d0        *d0=adpcm data size
  10081.     move.l    d0,size2
  10082.     bsr    make_adpcm_b
  10083.     move.l    size2(pc),d1    *save size
  10084.     movea.l    address2(pc),a2
  10085. do_wrt__tr:
  10086.     lea    fn2(pc),a1    *destination file name
  10087.     clr.l    buffer2        *dummy
  10088.     bsr    write_data
  10089.     bsr    print_em2
  10090.     bmi    bye_bye
  10091.     bra    mission_complete
  10092.  
  10093. pv_com:                *ピッチチェンジやボリュームチェンジ
  10094.     bsr    disp_proc
  10095.     move.b    fn1(pc),d0
  10096.     and.b    fn2(pc),d0
  10097.     tst.b    mix_cmd
  10098.     beq    pv0
  10099.     and.b    fn3(pc),d0
  10100. pv0:
  10101.     tst.b    d0
  10102.     beq    fn_error    *ファイルネームが揃ってない…
  10103.  
  10104.     lea    fn1(pc),a1
  10105.     bsr    read_data
  10106.     bsr    print_em2
  10107.     bmi    bye_bye
  10108.     tst.b    fn1_p16        *ファイルネームの拡張子チェック
  10109.     bpl    case_pv_adp
  10110.     move.l    d1,d3
  10111.     add.l    d1,d1        *2倍のエリアを確保(変換したPCMデータを格納するための)
  10112.     move.l    d1,-(sp)
  10113.     DOS    _MALLOC
  10114.     addq.w    #4,sp
  10115.     move.l    d0,mm_error
  10116.     bsr    print_em2
  10117.     bmi    bye_bye
  10118.     move.l    d0,buffer1
  10119.     move.l    d0,a1        *destinaton pcm buffer
  10120.     move.l    d2,a0        *source pcm buffer
  10121.     move.l    d3,d0
  10122.     lsr.l    d0        *get pcm count
  10123.     moveq.l    #0,d1
  10124.     move.b    (a5),d1        *pitch
  10125.     add.b    #12,d1
  10126.     moveq.l    #0,d6
  10127.     move.w    (a6),d6        *level
  10128.     bne    @f
  10129.     moveq.l    #100,d6        *0は100にする
  10130. @@:
  10131.     pea    (a0)
  10132.     bsr    do_pitch_vol    *>a1.l=new size
  10133.     DOS    _MFREE        *読み込んだPCMデータを破棄
  10134.     addq.w    #4,sp
  10135.     bra    pv_00
  10136. case_pv_adp:
  10137.     move.l    d1,size1
  10138.     move.l    d2,address1
  10139.     lsl.l    #3,d1        *adpcm sizeの8倍のエリアを確保(for transfomed pcm data)
  10140.     move.l    d1,-(sp)
  10141.     DOS    _MALLOC
  10142.     addq.w    #4,sp
  10143.     move.l    d0,mm_error
  10144.     bsr    print_em2
  10145.     bmi    bye_bye
  10146.     move.l    d0,buffer1
  10147.     move.l    d0,a1        *pcm buffer
  10148.     move.l    d2,a0        *adpcm buffer
  10149.     move.l    size1(pc),d0    *adpcm size
  10150.     moveq.l    #0,d1
  10151.     move.b    (a5),d1        *pitch
  10152.     add.b    #12,d1
  10153.     moveq.l    #0,d6
  10154.     move.w    (a6),d6        *level
  10155.     bne    @f
  10156.     moveq.l    #100,d6        *0は100にする
  10157. @@:
  10158.     bsr    adpcm_to_pcm    *pcm変換
  10159.     bsr    mfree_adpcm_a
  10160. pv_00:
  10161.     pea    (a1)        *new size
  10162.     move.l    buffer1(pc),-(sp)
  10163.     DOS    _SETBLOCK
  10164.     addq.w    #8,sp        *縮小
  10165.     move.l    a1,d0
  10166.     lsr.l    #2,d0
  10167.     move.l    d0,size1    *new adpcm size
  10168.  
  10169.     tst.b    mix_cmd
  10170.     beq    pv_sv        *mixの時はもう1つのファイルを読む
  10171.  
  10172.     lea    fn2(pc),a1
  10173.     bsr    read_data
  10174.     bsr    print_em2
  10175.     bmi    bye_bye
  10176.     tst.b    fn2_p16
  10177.     bpl    case_pv_adp2
  10178.     move.l    d1,d3
  10179.     add.l    d1,d1        *2倍のエリアを確保(変換したPCMデータを格納するため)
  10180.     move.l    d1,-(sp)
  10181.     DOS    _MALLOC
  10182.     addq.w    #4,sp
  10183.     move.l    d0,mm_error
  10184.     bsr    print_em2
  10185.     bmi    bye_bye
  10186.     move.l    d0,buffer2
  10187.     move.l    d0,a1        *destination pcm buffer
  10188.     move.l    d2,a0        *source pcm buffer
  10189.     move.l    d3,d0
  10190.     lsr.l    d0        *get pcm count
  10191.     moveq.l    #0,d1
  10192.     move.b    pitch_cmd+1(pc),d1
  10193.     add.b    #12,d1
  10194.     moveq.l    #0,d6
  10195.     move.w    volume_cmd+2(pc),d6
  10196.     bne    @f
  10197.     moveq.l    #100,d6        *0は100にする
  10198. @@:
  10199.     pea    (a0)
  10200.     bsr    do_pitch_vol    *>a1.l=new size
  10201.     DOS    _MFREE        *読み込んだPCMデータを破棄
  10202.     addq.w    #4,sp
  10203.     bra    pv_01
  10204. case_pv_adp2:
  10205.     move.l    d1,size2
  10206.     move.l    d2,address2
  10207.     lsl.l    #3,d1        *adpcm sizeの8倍のエリアを確保(for pcm data)
  10208.     move.l    d1,-(sp)
  10209.     DOS    _MALLOC
  10210.     addq.w    #4,sp
  10211.     move.l    d0,mm_error
  10212.     bsr    print_em2
  10213.     bmi    bye_bye
  10214.     move.l    d0,buffer2
  10215.     move.l    d0,a1        *pcm buffer
  10216.     move.l    d2,a0        *adpcm buffer
  10217.     move.l    size2(pc),d0    *adpcm size
  10218.     moveq.l    #0,d1
  10219.     move.b    pitch_cmd+1(pc),d1
  10220.     add.b    #12,d1
  10221.     moveq.l    #0,d6
  10222.     move.w    volume_cmd+2(pc),d6
  10223.     bne    @f
  10224.     moveq.l    #100,d6        *0は100にする
  10225. @@:
  10226.     bsr    adpcm_to_pcm    *pcm変換
  10227.     bsr    mfree_adpcm_b
  10228. pv_01:
  10229.     pea    (a1)        *new size
  10230.     move.l    buffer2(pc),-(sp)
  10231.     DOS    _SETBLOCK
  10232.     addq.w    #8,sp        *縮小
  10233.     move.l    a1,d0
  10234.     lsr.l    #2,d0
  10235.     move.l    d0,size2    *new adpcm size
  10236. *do_mix_fn1_fn2:
  10237.     move.l    size1(pc),d1
  10238.     move.l    size2(pc),d2
  10239.     move.l    buffer1(pc),a1
  10240.     move.l    buffer2(pc),a2
  10241.     bsr    mix_pcm        *destinationは自動確保 > addr.=buffer3, size=dest_size
  10242.     bsr    print_em2
  10243.     bmi    bye_bye
  10244.  
  10245.     tst.b    fn3_p16
  10246.     bpl    @f
  10247.     move.l    dest_size(pc),d1    *size
  10248.     lsl.l    #2,d1            *PCMサイズへ
  10249.     move.l    buffer3(pc),a2
  10250.     bra    do_mixwrt
  10251. @@:
  10252.     move.l    dest_size(pc),-(sp)
  10253.     DOS    _MALLOC
  10254.     addq.w    #4,sp
  10255.     move.l    d0,mm_error
  10256.     bsr    print_em2
  10257.     bmi    bye_bye
  10258.     move.l    d0,a0            *destination
  10259.     move.l    dest_size(pc),d0    *size
  10260.     move.l    buffer3(pc),a1        *source
  10261.     movem.l    d0/a0,-(sp)
  10262.     pea    (a1)
  10263.     bsr    pcm_to_adpcm
  10264.     DOS    _MFREE
  10265.     addq.w    #4,sp
  10266.     movem.l    (sp)+,d1/a2
  10267. do_mixwrt:
  10268.     pea    (a2)
  10269.     lea    fn3(pc),a1        *ミックス指定がある時は第三のファイルネームで
  10270.     bsr    write_data
  10271.     DOS    _MFREE
  10272.     addq.w    #4,sp
  10273.     bsr    print_em2
  10274.     bmi    bye_bye
  10275.     bra    mission_complete
  10276.  
  10277. pv_sv:                    *ミックスでないケース
  10278.     tst.b    fn2_p16
  10279.     bpl    @f
  10280.     move.l    size1(pc),d1        *PCMデータをセーブ
  10281.     lsl.l    #2,d1
  10282.     move.l    buffer1(pc),a2
  10283.     bra    do_pvwrt
  10284. @@:
  10285.     move.l    size1(pc),-(sp)
  10286.     DOS    _MALLOC
  10287.     addq.w    #4,sp
  10288.     move.l    d0,mm_error
  10289.     bsr    print_em2
  10290.     bmi    bye_bye
  10291.     move.l    d0,a0
  10292.     move.l    buffer1(pc),a1
  10293.     move.l    size1(pc),d0
  10294.     pea    (a0)
  10295.     pea    (a1)
  10296.     bsr    pcm_to_adpcm
  10297.     DOS    _MFREE
  10298.     addq.w    #4,sp
  10299.     move.l    size1(pc),d1        *size1
  10300.     move.l    (sp)+,a2        *address1
  10301. do_pvwrt:
  10302.     lea    fn2(pc),a1
  10303.     pea    (a2)
  10304.     bsr    write_data
  10305.     DOS    _MFREE
  10306.     addq.w    #4,sp
  10307.     bsr    print_em2
  10308.     bmi    bye_bye
  10309.     bra    mission_complete
  10310.  
  10311. do_pitch_vol:
  10312.     * < a0=source pcm data buffer
  10313.     * < a1=destination pcm data buffer
  10314.     * < d0.l=pcm data count
  10315.     * < d1.w=note shift(0~b~c(non shift)~d~18)
  10316.     * < d6.l=volume value(0%~200%)
  10317.     * > a1=data size
  10318.                 *パーセンテージを16進変換
  10319.     lea    levelchg(pc),a6
  10320.     clr.b    up_down-levelchg(a6)
  10321.  
  10322.     move.l    a1,-(sp)
  10323.     lsl.l    #7,d6
  10324.     divu    #100,d6
  10325.     andi.l    #$ffff,d6    *d6=0~200→0~256
  10326.  
  10327.     add.w    d1,d1        *d1=d1*2
  10328.     cmpi.b    #$18,d1
  10329.     beq    ~~est        *ピッチシフトは無しのケース
  10330.     bcs    ~~shift_down    *ピッチを下げるケース
  10331. *~~shift_up                *ピッチを上げるケース
  10332.     lea    frq_tbl(pc),a5
  10333.     move.w    -26(a5,d1.w),frq_flg-frq_tbl(a5)
  10334.     move.b    #1,up_down-frq_tbl(a5)    *set switch
  10335.     bra    ~~init_wk
  10336. ~~shift_down:
  10337.     lea    frq_tbl2(pc),a5
  10338.     move.w    (a5,d1.w),frq_flg-frq_tbl2(a5)
  10339.     st    up_down-frq_tbl2(a5)    *set switch
  10340. ~~init_wk:
  10341.     clr.w    last_val2-levelchg(a6)
  10342.     clr.w    frq_wk-levelchg(a6)
  10343. ~~est:
  10344.     lea    scaleval(pc),a5
  10345.     moveq.l    #0,d3
  10346.     moveq.l    #0,d7
  10347.     moveq.l    #$0f,d4
  10348.     clr.w    last_val-levelchg(a6)
  10349.     clr.b    hajimete-levelchg(a6)
  10350. ~~atp_lp:
  10351.     move.w    (a0)+,d2
  10352.     muls    d6,d2        *d6にはパーセントが
  10353.     asr.l    #7,d2        *入っている
  10354.  
  10355.     tst.b    hajimete-levelchg(a6)    *初めて
  10356.     bne    ~~up_or_down
  10357.     seq.b    hajimete-levelchg(a6)
  10358.     bra    ~~wrt_pcm_dt
  10359. ~~up_or_down:
  10360.     tst.b    up_down-levelchg(a6)
  10361.     beq    ~~wrt_pcm_dt    *non pitch shift
  10362.     bmi    ~~do_shift_down
  10363.  
  10364.     move.w    frq_flg(pc),d1
  10365.     add.w    d1,frq_wk-levelchg(a6)
  10366.     bcc    ~~check_dsz
  10367.     bra    ~~wrt_pcm_dt
  10368. ~~do_shift_down:
  10369.     move.w    frq_flg(pc),d1
  10370.     beq    @f
  10371.     add.w    d1,frq_wk-levelchg(a6)
  10372.     bcc    ~~wrt_pcm_dt
  10373. @@:
  10374.     move.w    d2,d1
  10375.     add.w    last_val2(pc),d1
  10376.     asr.w    d1        *線形補間
  10377.     move.w    d1,(a1)+
  10378. ~~wrt_pcm_dt:
  10379.     move.w    d2,(a1)+    *store pcm data to buffer
  10380. ~~check_dsz:
  10381.     move.w    d2,last_val2-levelchg(a6)
  10382.     subq.l    #1,d0
  10383.     bne    ~~atp_lp
  10384.     sub.l    (sp)+,a1    *data size
  10385.     rts
  10386.  
  10387. _4_com:                *4段階のデータを生成
  10388.     bsr    disp_proc
  10389.     tst.b    fn1
  10390.     beq    fn_error    *ファイルネームが揃ってない…
  10391.  
  10392.     lea    fn1(pc),a1
  10393.     bsr    read_data
  10394.     bsr    print_em2
  10395.     bmi    bye_bye
  10396.  
  10397.     tst.b    fn1_p16        *ファイルネームチェック
  10398.     bpl    _4c_00
  10399.     move.l    d1,d3
  10400.     add.l    d1,d1        *2倍のエリアを確保(変換したPCMデータを格納するため)
  10401.     move.l    d1,-(sp)
  10402.     DOS    _MALLOC
  10403.     addq.w    #4,sp
  10404.     move.l    d0,mm_error
  10405.     bsr    print_em2
  10406.     bmi    bye_bye
  10407.     move.l    d0,buffer1
  10408.     move.l    d0,a1        *destination pcm buffer
  10409.     move.l    d2,a0        *source pcm buffer
  10410.     move.l    d3,d0
  10411.     lsr.l    d0        *get pcm count
  10412.     moveq.l    #0,d1
  10413.     move.b    (a5),d1        *pitch
  10414.     add.b    #12,d1
  10415.     moveq.l    #0,d6
  10416.     move.w    (a6),d6        *level
  10417.     bne    @f
  10418.     moveq.l    #100,d6        *0は100にする
  10419. @@:
  10420.     pea    (a0)
  10421.     bsr    do_pitch_vol    *>a1.l=new size
  10422.     DOS    _MFREE
  10423.     addq.w    #4,sp
  10424.     bra    _4c_01
  10425. _4c_00:
  10426.     move.l    d1,size1
  10427.     move.l    d2,address1
  10428.     lsl.l    #3,d1        *adpcm sizeの8倍のエリアを確保(for pcm data)
  10429.     move.l    d1,-(sp)
  10430.     DOS    _MALLOC
  10431.     addq.w    #4,sp
  10432.     move.l    d0,mm_error
  10433.     bsr    print_em2
  10434.     bmi    bye_bye
  10435.     move.l    d0,buffer1
  10436.     move.l    d0,a1        *pcm buffer
  10437.     move.l    d2,a0        *adpcm buffer
  10438.     move.l    size1(pc),d0    *adpcm size
  10439.     moveq.l    #0,d1
  10440.     move.b    (a5),d1
  10441.     add.b    #12,d1
  10442.     moveq.l    #0,d6
  10443.     move.w    (a6),d6
  10444.     bne    @f
  10445.     moveq.l    #100,d6        *0は100にする
  10446. @@:
  10447.     bsr    adpcm_to_pcm    *pcm変換
  10448.     bsr    mfree_adpcm_a    *もういらない
  10449. _4c_01:
  10450.     pea    (a1)        *new size
  10451.     move.l    buffer1(pc),-(sp)
  10452.     DOS    _SETBLOCK
  10453.     addq.w    #8,sp        *縮小
  10454.     move.l    a1,d0
  10455.     lsr.l    #2,d0
  10456.     move.l    d0,size1    *new adpcm size
  10457.  
  10458.     move.l    #fn2,fn_adr    *base file name
  10459.     tst.b    fn2
  10460.     bne    @f
  10461.     move.l    #fn1,fn_adr
  10462. @@:
  10463.     move.l    buffer1(pc),buffer3
  10464.     move.l    size1(pc),size3
  10465.     pea    _4_back(pc)    *push return addr.
  10466.     cmpi.b    #'V',_4_cmd
  10467.     beq    by4levels
  10468.     cmpi.b    #'P',_4_cmd
  10469.     beq    by4scales
  10470.     bra    fn_error
  10471. _4_back:
  10472.     bsr    print_em2
  10473.     bmi    bye_bye
  10474. *    bra    mission_complete
  10475.  
  10476. mission_complete:
  10477.     pea    done_it(pc)
  10478.     DOS    _PRINT
  10479.     addq.w    #4,sp
  10480.     bra    bye_bye
  10481. disp_proc:            *now processing
  10482.     IOCS    _OS_CUROF
  10483.     pea    proc_mes(pc)
  10484.     DOS    _PRINT
  10485.     addq.w    #4,sp
  10486.     IOCS    _B_UP_S
  10487.     rts
  10488. fn_error:            *パラメータの間違いなら
  10489.     pea    fn_er_mes(pc)
  10490.     DOS    _PRINT
  10491.     addq.w    #4,sp
  10492.     bra    bye_bye
  10493. outm_error
  10494.     pea    outm_er_mes(pc)
  10495.     DOS    _PRINT
  10496.     addq.w    #4,sp
  10497.     clr.l    mm_error
  10498.     rts
  10499. read_error:
  10500.     pea    rer_mes(pc)
  10501.     DOS    _PRINT
  10502.     addq.w    #4,sp
  10503.     rts
  10504. write_error:
  10505.     pea    wer_mes(pc)
  10506.     DOS    _PRINT
  10507.     addq.w    #4,sp
  10508.     rts
  10509. disk_full_error:
  10510.     pea    dkf_mes(pc)
  10511.     DOS    _PRINT
  10512.     addq.w    #4,sp
  10513.     rts
  10514. fop_er:
  10515.     pea    fop_mes(pc)
  10516.     DOS    _PRINT
  10517.     addq.w    #4,sp
  10518.     rts
  10519. gram_error:
  10520.     lea    title(pc),a1
  10521.     bsr    ppp
  10522.  
  10523.     pea    ger_mes(pc)
  10524.     DOS    _PRINT
  10525.     addq.w    #4,sp
  10526. print_hlp:
  10527.     pea    hlp_mes(pc)
  10528.     DOS    _PRINT
  10529.     addq.w    #4,sp
  10530.     bra    bye_bye
  10531.  
  10532. ppp:
  10533.     move.w    #$0002,-(a7)
  10534.     pea.l    (a1)
  10535.     DOS    _FPUTS
  10536.     addq.l    #6,a7
  10537.     rts
  10538.  
  10539. *    以下'XAPNEL.X'のルーチンの流用です
  10540. *----------------------------------------
  10541. *    X68k ADPCM PUTI NOISE ELIMINATOR
  10542. *
  10543. *        XAPNEL
  10544. *
  10545. *     Programmed by Z.Nishikawa
  10546. *----------------------------------------
  10547. fm_addr_port:    equ    $e90001
  10548. fm_data_port:    equ    $e90003
  10549. DMADSTAT:    equ    $c32
  10550. OPMCTRL:    equ    $9da
  10551. num_of_80:    equ    32
  10552.  
  10553. adpcmout:            *IOCS    $60
  10554.     movem.l    d1-d2/a0-a2,-(sp)
  10555.     bsr    adpcm_end
  10556.     lea    OCR3,a0
  10557.     lea    last_param(pc),a2
  10558.     move.w    d1,(a2)+
  10559.     move.l    a1,(a2)+
  10560.     move.l    d2,(a2)+
  10561.     clr.w    (a2)
  10562. *@@:
  10563. *    tst.b    DMADSTAT.w
  10564. *    bne    @b
  10565.  
  10566.     moveq.l    #0,d0
  10567.  
  10568.     cmpi.l    #$feff,d2
  10569.     bls    adpcm_sgl    *$feff以下なら単回処理(<d0.l=0)
  10570.  
  10571.     move.l    d2,d0
  10572.     move.l    #$feff,d2
  10573.     divu    d2,d0
  10574.     swap    d0
  10575.     tst.w    d0
  10576.     beq    @f
  10577.     swap    d0
  10578.     bra    store_lpc
  10579. @@:
  10580.     swap    d0
  10581.     subq.w    #1,d0
  10582. store_lpc:
  10583.     move.w    d0,(a2)        *d0回数
  10584.     sub.l    d2,-4(a2)    *size補正
  10585.     moveq.l    #$80,d0        *ループ指定
  10586. adpcm_sgl:
  10587.     * a0=OCR3,a2=last_feff
  10588. *    tst.b    DMADSTAT.w
  10589. *    bne    adpcm_sgl    *待ちループ
  10590.  
  10591.     addq.b    #%0000_0010,d0    *play指定
  10592.     move.b    d0,DMADSTAT.w
  10593.     move.b    #%0111_1010,(a0)    *aray mode
  10594.     st    CSR3-OCR3(a0)        *status set
  10595.     move.w    #2,BTC3-OCR3(a0)    *アレイテーブルの個数
  10596.     lea    aray_tbl(pc),a2
  10597.     move.l    a2,BAR3-OCR3(a0)    *アレイテーブルのアドレス
  10598.     move.l    a1,next_at-aray_tbl(a2)
  10599.     move.w    d2,next_at+4-aray_tbl(a2)
  10600.     bsr    adpcm_dtst
  10601.     move.b    #$02,$e92001
  10602.     movem.l    (sp)+,d1-d2/a0-a2
  10603.     rts
  10604.  
  10605. adpcm_dtst:
  10606.     move.b    OPMCTRL.w,d0    *音声合成クロック読みだし
  10607.     tas.b    d0
  10608.     cmpi.w    #$02_00,d1
  10609.     bcs    adpcm_clkst    *5.2kHzならばクロック4MHz
  10610.  
  10611.     sub.w    #$02_00,d1
  10612.     andi.b    #$7f,d0        *7.8kHzならばクロック8MHz
  10613.  
  10614. adpcm_clkst:
  10615.     move.b    d0,OPMCTRL.w
  10616.     opmset    #$1b,d0        *クロックを書き込む
  10617.     move.w    d1,d0
  10618.     andi.b    #%0000_0011,d0
  10619.     beq    adpcm_pan_not
  10620.  
  10621.     cmpi.b    #3,d0        *出力チェック
  10622.     bne    adpcm_panst
  10623. adpcm_pan_not:
  10624.     eori.b    #%0000_0011,d0    *ビット反転
  10625. adpcm_panst:
  10626.     lsr.w    #6,d1        *サンプリング周波数を下位バイトへ
  10627.     andi.b    #%0000_1100,d1
  10628.     or.b    d0,d1        *出力モードを重ね合わせる
  10629.     move.b    $e9a005,d0    *周波数やパンをゲット
  10630.     andi.b    #%1111_0000,d0
  10631.     or.b    d1,d0        *設定値を作成
  10632.     move.b    #$88,CCR3-OCR3(a0)    *dma start
  10633.     move.b    d0,$e9a005    *コントロールデータ送信
  10634.     rts
  10635.  
  10636. adpcmmod:            *IOCS    $67
  10637.     tst.b    d1
  10638.     beq    adpcm_end
  10639.     cmpi.b    #1,d1
  10640.     beq    adpcm_stop
  10641.     cmpi.b    #2,d1
  10642.     beq    adpcm_cnt
  10643.     moveq.l    #-1,d0    *エラーコード
  10644.     rts
  10645. adpcm_end:
  10646.     moveq.l    #0,d0        *終了コード
  10647.     move.w    sr,-(sp)
  10648.     ori.w    #$0700,sr    *最上位割り込みマスク
  10649.     move.b    #$10,CCR3
  10650.     move.b    #$88,$e92003
  10651.     move.w    d0,DMADSTAT.w
  10652.  
  10653.     move.w    (sp)+,sr
  10654.     rts
  10655. adpcm_stop:
  10656.     moveq.l    #0,d0
  10657.     move.w    sr,-(sp)
  10658.     ori.w    #$0700,sr
  10659.  
  10660.     move.b    #$20,CCR3    *動作中断
  10661.                 *move.b    #$88,$e92003をしないのは再開した時に音が変に鳴るから
  10662.     move.w    (sp)+,sr
  10663.     rts
  10664. adpcm_cnt:
  10665.     move.b    #$08,CCR3    *動作継続
  10666.     moveq.l    #0,d0
  10667.     rts
  10668.  
  10669. int_adpcm_stop:            *ADPCMデータの再生が終了するとここへくる
  10670.     movem.l    d0-d2/a0-a1,-(sp)
  10671.     lea    last_feff(pc),a0
  10672.     tst.w    (a0)
  10673.     beq    stop_quit
  10674.     subq.w    #1,(a0)
  10675.     move.l    #$feff,d1
  10676.     move.l    -(a0),d0    *get size
  10677.     move.l    d0,d2
  10678.     sub.l    d1,d0
  10679.     bcs    @f
  10680.     sub.l    d1,(a0)        *size=size-$feff
  10681.     move.l    d1,d2
  10682. @@:
  10683.     add.l    d1,-(a0)
  10684.     move.l    (a0),a1        *get address
  10685.     move.w    -(a0),d1    *get param
  10686.  
  10687.     lea    OCR3,a0
  10688.     move.b    #%0000_0010,DMADSTAT.w
  10689.     move.b    #%0111_0010,(a0)    *no aray
  10690.     st    CSR3-OCR3(a0)        *status set
  10691.     move.l    a1,MAR3-OCR3(a0)
  10692.     move.w    d2,MTC3-OCR3(a0)
  10693.     bsr    adpcm_dtst
  10694.     move.b    #$02,$e92001
  10695.  
  10696.     movem.l    (sp)+,d0-d2/a0-a1
  10697.     rte
  10698. stop_quit:
  10699.     move.b    #$10,CCR3    *dma stop
  10700.     st    CSR3        *status clear
  10701.     move.b    #$88,$e92003
  10702.     clr.b    DMADSTAT.w
  10703.     movem.l    (sp)+,d0-d2/a0-a1
  10704. break:                *ブレークキーが押されるとここへ
  10705.     rte
  10706.  
  10707. adpcm_stop_v:    ds.l    1
  10708. adpcmout_v:    ds.l    1
  10709. adpcmmod_v:    ds.l    1
  10710. aray_tbl:
  10711.     dc.l    dummy_data
  10712.     dc.w    num_of_80
  10713. next_at:
  10714.     dc.l    0
  10715.     dc.w    0
  10716. dummy_data:    dcb.b    num_of_80,$80
  10717.     .even
  10718. last_param:    ds.w    1
  10719. last_address:    ds.l    1
  10720. last_size:    ds.l    1
  10721. last_feff:    dc.w    0
  10722.  
  10723. set_pan_frq:
  10724.     move.w    last_param(pc),d1
  10725.     move.b    OPMCTRL.w,d0    *音声合成クロック読みだし
  10726.     tas.b    d0
  10727.     cmpi.w    #$02_00,d1
  10728.     bcs    @f        *5.2kHzならばクロック4MHz
  10729.  
  10730.     sub.w    #$02_00,d1
  10731.     andi.b    #$7f,d0        *7.8kHzならばクロック8MHz
  10732.  
  10733. @@:
  10734.     move.b    d0,OPMCTRL.w
  10735.     opmset    #$1b,d0        *クロックを書き込む
  10736.     move.w    d1,d0
  10737.     andi.b    #%0000_0011,d0
  10738.     beq    @f
  10739.  
  10740.     cmpi.b    #3,d0        *出力チェック
  10741.     bne    spf1
  10742. @@:
  10743.     eori.b    #%0000_0011,d0    *ビット反転
  10744. spf1:
  10745.     lsr.w    #6,d1        *サンプリング周波数を下位バイトへ
  10746.     andi.b    #%0000_1100,d1
  10747.     or.b    d0,d1        *出力モードを重ね合わせる
  10748.     move.b    $e9a005,d0    *周波数やパンをゲット
  10749.     andi.b    #%1111_0000,d0
  10750.     or.b    d1,d0        *設定値を作成
  10751.     move.b    d0,$e9a005    *コントロールデータ送信
  10752.     rts
  10753.  
  10754. set_vect:                *ADPCMの停止処理の書き換え
  10755.     movem.l    d0-d1/a1,-(sp)
  10756.  
  10757.     lea    break(pc),a1        *ブレークキーベクタの乗っ取り
  10758.     move.l    $ac.w,break_org
  10759.     move.l    a1,$ac.w
  10760.  
  10761.     lea    abort(pc),a1
  10762.     move.w    #$01fd,d1    *abort
  10763.     IOCS    _B_INTVCS
  10764.     move.l    d0,last_iocs-abort(a1)
  10765.  
  10766.     moveq.l    #$6a,d1
  10767.     lea    int_adpcm_stop(pc),a1
  10768.     IOCS    _B_INTVCS
  10769.     move.l    d0,adpcm_stop_v-int_adpcm_stop(a1)
  10770.  
  10771.     move.w    #$160,d1    *IOCS    _ADPCMOUTを乗っ取る
  10772.     lea    adpcmout(pc),a1
  10773.     IOCS    _B_INTVCS
  10774.     move.l    d0,adpcmout_v-adpcmout(a1)
  10775.  
  10776.     move.w    #$167,d1    *IOCS    _ADPCMMODを乗っ取る
  10777.     lea    adpcmmod(pc),a1
  10778.     IOCS    _B_INTVCS
  10779.     move.l    d0,adpcmmod_v-adpcmmod(a1)
  10780.  
  10781.     move.w    #$0403,d1        *frq/pan
  10782.     moveq.l    #num_of_80,d2        *length
  10783.     lea    dummy_data(pc),a1
  10784.     IOCS    _ADPCMOUT        *ダミー再生
  10785.  
  10786. *    move.b    #%0001_0000,$e840c7    *DMA_CCR SAB=1 強制停止
  10787. *    st.b    $e840c0            *$FF -> $e840c0
  10788. *    move.b    #%0000_0100,$e92001    *adpcm rec start
  10789. *    move.b    #%0000_0001,$e92001    *adpcm all end
  10790.  
  10791.     move.w    #NOP,back_vect        *ベクタ復元必要
  10792.  
  10793.     movem.l    (sp)+,d0-d1/a1
  10794.     rts
  10795.  
  10796. back_vect:            *ベクタの復元
  10797.     rts
  10798.     movem.l    d0-d1/a1,-(sp)
  10799.  
  10800.     moveq.l    #0,d1
  10801.     IOCS    _ADPCMMOD    *まず停止
  10802.  
  10803.     move.l    break_org(pc),$ac.w    *ブレークキーベクタの復元
  10804.  
  10805.     movea.l    last_iocs(pc),a1
  10806.     move.w    #$01fd,d1    *abort
  10807.     IOCS    _B_INTVCS
  10808.  
  10809.     movea.l    adpcm_stop_v(pc),a1
  10810.     moveq.l    #$6a,d1
  10811.     IOCS    _B_INTVCS    *get back int adpcm stop vector
  10812.  
  10813.     movea.l    adpcmout_v(pc),a1
  10814.     move.w    #$160,d1
  10815.     IOCS    _B_INTVCS    *get back int adpcmout vector
  10816.  
  10817.     movea.l    adpcmmod_v(pc),a1
  10818.     move.w    #$167,d1
  10819.     IOCS    _B_INTVCS    *get back int adpcmmod vector
  10820.     movem.l    (sp)+,d0-d1/a1
  10821.  
  10822.     rts
  10823.  
  10824. abort:                *ABORT時の処理
  10825.     bsr    back_vect
  10826.     move.l    last_iocs(pc),-(sp)
  10827.     rts
  10828.  
  10829.     .bss
  10830. _8bit_pcm:    ds.b    1
  10831.     .even
  10832. num_of_files:    ds.l    1
  10833. fn_buf:        ds.l    1
  10834. fn_buf_size:    ds.l    1
  10835.  
  10836. filbuf:        ds.b    21
  10837. ATR:        ds.b    1
  10838.         ds.w    2
  10839. FILE_SIZE:    ds.l    1
  10840. FILE_NAME:    ds.b    23
  10841.     .even
  10842. suji:        ds.b    16
  10843. fn1:        DS.B    92
  10844. fn2:        DS.B    92
  10845. fn3:
  10846. wfile_name:    DS.B    92
  10847. cdr_str:    ds.b    1
  10848.         ds.b    2    *':\'
  10849. pathbf:        ds.b    92
  10850. wfn1:        ds.b    92
  10851. wfn2:        ds.b    92
  10852.     .even
  10853. param_mem:
  10854. wfn3:        ds.b    92    *別目的にも使用される
  10855. mix_mode:    ds.b    1
  10856. played:        ds.b    1
  10857. input_buffer:    ds.b    1
  10858.         ds.b    1
  10859.         ds.b    256
  10860. prt_md:        ds.b    1
  10861.     .even
  10862. recording_time:    ds.w    1
  10863. bank_sel:    ds.b    1
  10864. ESC_ON:        ds.b    1
  10865. use_fm:        ds.b    1
  10866. data_a:        ds.b    1
  10867. data_b:        ds.b    1
  10868. pl_mi:        ds.b    1
  10869. up_down:    ds.b    1
  10870. hajimete:    ds.b    1
  10871. fn_sj:        ds.b    1
  10872. last_point:    ds.b    1
  10873. dirofchg:    ds.b    1
  10874. dt_mem:        ds.b    1
  10875. fn1_p16:    ds.b    1
  10876. fn2_p16:    ds.b    1
  10877. fn3_p16:    ds.b    1
  10878.     .even
  10879. ssp:        ds.l    1
  10880. rec_data_size:    ds.l    1
  10881. file_list:    ds.l    1
  10882. reg_buff:    ds.l    15
  10883. reg_buff2:    ds.l    15
  10884. reg_buff3:    ds.l    15
  10885. current_drive:    ds.w    1
  10886. mem_max:    ds.l    1
  10887. fo_error:    ds.l    1
  10888. mm_error:    ds.l    1
  10889. rd_error:    ds.l    1
  10890. wr_error:    ds.l    1
  10891. disk_full:    ds.l    1
  10892. get_pt_buf:    ds.l    1
  10893. get_pt_buf1:    ds.l    1
  10894.  
  10895. org_sp:        ds.l    1    *元々のスタックを格納する所
  10896. last_val:    ds.w    1
  10897. last_val2:    ds.w    1
  10898. last_iocs:    ds.l    1    *abort vector
  10899.  
  10900. address1:    ds.l    1    *0
  10901. buffer1:    ds.l    1    *4
  10902. size1:        ds.l    1    *8
  10903. start_point1:    ds.l    1    *12
  10904. end_point1:    ds.l    1    *16
  10905.  
  10906. address2:    ds.l    1    *20
  10907. buffer2:    ds.l    1    *24
  10908. size2:        ds.l    1    *28
  10909. start_point2:    ds.l    1    *32
  10910. end_point2:    ds.l    1    *36
  10911.  
  10912. address3:    ds.l    1
  10913. buffer3:    ds.l    1
  10914. size3:        ds.l    1
  10915.  
  10916. brk_wk:        ds.w    1
  10917. work1:        ds.l    1    *汎用
  10918. work2:        ds.l    1
  10919. fn_adr:        ds.l    1
  10920. work3:        ds.l    1
  10921. offset:        ds.l    1
  10922. dest_size:    ds.l    1
  10923. add_frq:    ds.l    1
  10924. add_times:    ds.w    1
  10925. frq_flg:    ds.w    1
  10926. frq_wk:        ds.w    1
  10927. genten_y:    ds.w    1
  10928. ent_path:    ds.b    70
  10929. prt_bf:        ds.b    96
  10930. patch1:        ds.w    1
  10931. fn_buffer1:    ds.l    1
  10932. fn_point1:    ds.l    1
  10933. rd_fn:        ds.b    92
  10934. bank_a_fn:    ds.b    92
  10935. bank_b_fn:    ds.b    92
  10936. trn_rvs:    ds.l    1
  10937. break_org:    ds.l    1
  10938. atb_step:    ds.l    1    *autobend work
  10939. atb_rvs:    ds.w    1    *autobend work
  10940. atb_rvswk:    ds.w    1    *autobend work
  10941. atb_frqsrc:    ds.l    1    *autobend work
  10942. atb_frqnow:    ds.l    1    *autobend work
  10943. atb_sgn:    ds.l    1    *autobend work
  10944.         ds.b    stack
  10945. user_sp:
  10946.     .end
  10947.